算数表达式求值(C语言)
2016-09-06 20:18
585 查看
#include<stdio.h> #include<stdlib.h> #define SIZE 50 typedef int DATA; #include"SeqStack.h"//顺序栈 int IsOperator(char c)//判断是否为运算符,是返回1,否返回0 { switch(c) { case '+': case '-': case '*': case '/': case '(': case ')': case '=': return 1; break; default: return 0; break; } } int PRI(char oper1,char oper2)//判断两个运算符的优先级 //oper1>oper2 返回1; oper1<oper2 返回-1; oper1='(' & oper2=')'返回0; //优先级由小到大 ( +- */ ) // 等式顺序:num1 oper1 num2 oper2 { int pri; switch (oper2) { case'+': case'-': if(oper1=='('||oper1=='=') pri=-1; //oper1<oper2 else pri=1; break; case'*': case'/': if(oper1=='*'||oper1=='/'||oper1==')') pri=1; //oper1>oper2 else pri=-1; break; case '(': if(oper1==')')//'('右侧不能马上出现')' { printf("wrong!!\n"); exit(0); } else pri=-1; break; case ')': if(oper1=='=') { printf("括号不匹配\n"); exit(0); } else if(oper1=='(')pri=0; else pri=1; break; case'=': if(oper1=='(') { printf("括号不匹配\n"); exit(0); } else if(oper1=='=') pri=0; //等号配对返回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; //flag用以处理多位数,while中每次从表达式中取一个字符,flag=0时:操作数已入栈;flag=1时:有操作数要入栈 DATA a,b,c,q,x,t,oper;//q用来保存多位操作数 StackOper=SeqStackInit();//初始化栈 StackData=SeqStackInit(); q=0; x='=';//'='作为表达式的第一位运算符入栈 SeqStackPush(StackOper,x);//"=" 进操作符栈 // x=SeqStackPeek(StackOper);///////////////////////////////////////////////////// c=exp[i++];//从字符串中获取第一个字符 c=exp[0],i=1 while (c!='='||x!='=')//遍历表达式的每一个字符,直到'=' ; x:栈顶字符 ; c:当前运算符 { if(IsOperator(c))//是操作符时 { if(flag){//将之前的(多位)操作数q入栈 SeqStackPush(StackData,q); q=0; flag=0;//操作数已入栈 } switch(PRI(x,c)){ case -1://x<c当前运算符大于前一运算符 进栈 SeqStackPush(StackOper,c); c=exp[i++]; break; case 0://c=x or ( ) c=SeqStackPop(StackOper); c=exp[i++];//运算符 括号 等号出栈(抛弃) break; case 1://x>c 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;//多位数进位 flag=1; c=exp[i++];//取表达式下一个字符 } else { printf("input wrong!\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; }
相关文章推荐
- C语言 算数表达式求值(顺序栈应用实例)
- 用C语言写解释器(二)——表达式求值
- “栈”的典型应用—表达式求值(C语言实现)
- Dijkstra 的双栈算数表达式求值算法的学习
- 序列点在C语言表达式求值中的作用
- 2016 UESTC Training for Data Structures N - 秋实大哥搞算数 CDOJ 1074 栈 表达式求值
- C语言表达式求值顺序
- 表达式求值,栈的应用(C语言)
- 栈的运用(算数表达式求值的算符优先算法 十以内简单版)
- C语言算数运算符和算数表达式
- 【C语言】表达式求值中的类型转换问题
- 算数表达式求值
- C语言简单计算器原理——表达式求值(采用逆波兰表达式和栈结合)
- 栈的操作和c语言实现算术表达式求值
- C语言中栈和队列实现表达式求值的实例
- C++ 实现 算数表达式求值
- C语言 写的 表达式求值。
- C语言课设:中缀表达式转后缀表达式并求值(续)
- 栈实现表达式求值(C语言)
- C语言 写的 表达式求值。