//SeqStack.h typedef struct stack { DATA data[SIZE+1]; //数据元素 int top; //栈顶 }SeqStack; SeqStack *SeqStackInit() { SeqStack *p; if(p=(SeqStack *)(malloc)(sizeof(SeqStack))) //申请栈内存 { p->top = 0; //设置栈顶为零 return p; //返回指向栈的指针 } return NULL; } int SeqStackIsEmpty(SeqStack *s) //判断栈是否为空 { return(s->top==0); } void SeqStackFree(SeqStack *s) //释放栈所占用空间 { if(s) free(s); } void SeqStackClera(SeqStack *s) // 清空栈 { s->top = 0; } int SeqStackFull(SeqStack *s) //判断栈是否已满 { return(s->top==SIZE) ; } int SeqStackPush(SeqStack *s, DATA data) // 入栈操作 { if((s->top+1)>SIZE) { printf("栈溢出!\n"); return 0; } s->data[++s->top] = data; //栈元素入栈 return 1; } DATA SeqStackPop(SeqStack *s) //出栈操作 { if(s->top==0) { printf("栈为空!"); exit(0); } return (s->data[s->top--]); } DATA SeqStackPeek(SeqStack *s) // 读栈顶数据 { if(s->top==0) { printf("栈为空! "); exit(0); } return (s->data[s->top]); }
//CalcExp.c #include<stdio.h> #include<stdlib.h> #define SIZE 50 typedef int DATA; #include "SeqStack.h" int IsOperator(char c) // 检查字符是否为运算符 { switch(c) { case‘+‘: case‘-‘: case‘*‘: case‘/‘: case‘(‘: case‘)‘: case‘=‘: return 1; break; default: return 0; break; } } int PRI(char oper1,char oper2) // 判断两个运算符的优先级 //opera1>oper2 返回1 //oper1<oper2 返回-1 //oper1=oper2 返回0 { int pri; switch(oper2) //判断运算符优先级 { case ‘+‘: case ‘-‘: if(oper1==‘(‘ || oper1==‘=‘)// 为左括号或表达式开始符号 pri = -1; // 返回小于 else pri = 1; break; case ‘*‘: case ‘/‘: if(oper1==‘*‘||oper1==‘/‘||oper1==‘)‘) pri = 1; else pri=-1; break; case ‘(‘: if(oper1==‘)‘) // 右括号右侧不能马上出现左括号 { printf("语法错误!\n"); exit(0); } else pri=-1; break; case ‘)‘: if(oper1==‘(‘) pri = 0; else if(oper1==‘=‘) { printf("括号不匹配!\n"); exit(0); }else pri=1; break; case ‘=‘: if(oper1==‘(‘) { printf("括号不匹配!\n"); exit(0); }else if(oper1==‘=‘) pri =0; else pri =1; break; } return pri; } int Calc(int a, int oper ,int b) // 计算两个操作数的结果 { switch(oper) { case ‘+‘: return a+b; case ‘-‘: return a-b; case ‘*‘: return a*b; case‘/‘: if(b!=0) return a/b; else { printf("除0溢出!\n"); exit(0); } } } int CalcExp(char exp[]) // 表达式计算函数 { SeqStack *StackOper ,*StackData; int i=0,flag=0; DATA a,b,c,q,x,t,oper; StackOper = SeqStackInit();//初始化两个栈 StackData = SeqStackInit(); q=0; x=‘=‘; SeqStackPush(StackOper, x); //首先将等号(=)进入操作符栈 x=SeqStackPeek(StackOper);//获取操作符栈的首元素 c=exp[i++]; while(c!=‘=‘||x!=‘=‘) { if(IsOperator(c)) // 若输入的是运算符 { if(flag){ SeqStackPush(StackData,q); // 将操作符入栈 q=0 ; flag = 0; } switch(PRI(x,c))//判断运算符的优先级 { case -1: SeqStackPush(StackOper,c);//运算符进栈 c=exp[i++] ; break; case 0: c = SeqStackPop(StackOper);//运算符出栈(抛弃) c=exp[i++]; break; case 1: oper = SeqStackPop(StackOper); //运算符出栈 b=SeqStackPop(StackData); // 两个操作符出栈 a=SeqStackPop(StackData); t=Calc(a,oper,b); SeqStackPush(StackData,t);//将运算结果入栈 break; } } else if(c>=‘0‘ && c<=‘9‘) // 若输入字符在0-9之间 { c-=‘0‘; q=q*10+c; c=exp[i++]; flag=1; } else { printf("输入错误!\n"); getch(); exit(0); } x=SeqStackPeek(StackOper);//获取栈顶的运算符 } q=SeqStackPop(StackData) ; SeqStackFree(StackOper);//释放栈所占用的空间 SeqStackFree(StackData); return q; // 出栈,返回结果 } int main() { int c; char exp[80]; printf("请输入要计算的表达式(以=结束):"); scanf("%s",exp); printf("%s%d\n",exp,CalcExp(exp)); getch(); return 0; }
原文地址:http://9815936.blog.51cto.com/9805936/1640453