栈——表达式求值

来源:互联网 发布:monkey社交软件下载 编辑:程序博客网 时间:2024/06/07 03:57
//题目描述:(表达式求值)输入一行正确的表达式,每个数在1-9之间,且算符只能为“+、-、*、/、(、)”,//表达式以'#'结束,例如“2+3*4-6/3#”或“(3*(4-2)+1)*3+5#”等较简单的表达式。//顺序栈#include <stdio.h>#include <stdlib.h>#define STACK_CHAR_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef struct node{SElemType *base;SElemType *top;int stacksize;}SqStack;void InitStack(SqStack &S)//栈的初始化{S.base=(SElemType *)malloc(STACK_CHAR_SIZE*sizeof(SElemType));if(!S.base) exit(0);S.top=S.base;S.stacksize=STACK_CHAR_SIZE;}void Push(SqStack &S,SElemType e) //进栈{if(S.top-S.base>=S.stacksize){S.base=(SElemType *)realloc(S.base,(STACK_CHAR_SIZE+STACKINCREMENT)*sizeof(SqStack));if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;}void Pop(SqStack &S,SElemType &e)//出栈{if(S.top==S.base) exit(0);e=*--S.top;}SElemType GetTop(SqStack S)//取栈顶元素{SElemType e;if(S.top==S.base) exit(0);e=*(S.top-1);return e;}int In_OPND(SElemType ch)//判断当前字符为操作数{if(ch>='0' && ch<='9')return 1;elsereturn 0;}SElemType Compare(SElemType op1,SElemType op2)//比较两运算符的优先权{SElemType e;if(op1=='+' || op1=='-'){switch(op2){case '+':;case '-':;case ')':;case '#':e='>';break;case '*':;case '/':;case '(':e='<';break;}}else if(op1=='*' || op1=='/'){switch(op2){case '+':;case '-':;case '*':;case '/':;case ')':;case '#':e='>';break;case '(':e='<';break;}}else if(op1=='('){switch(op2){case '+':;case '-':;case '*':;case '/':;case '(':e='<';break;case ')':e='=';break;}}else if(op1==')'){switch(op2){case '+':;case '-':;case '*':;case '/':;case ')':;case '#':e='>';break;}}else if(op1=='#'){switch(op2){case '+':;case '-':;case '*':;case '/':;case '(':e='<';break;case '#':e='=';break;}}return e;}SElemType Operate(SElemType a,SElemType op,SElemType b) //执行优先权高的操作符运算{SElemType result;switch(op){case '+':result=(a-'0')+(b-'0')+'0';break;case '-':result=(a-'0')-(b-'0')+'0';break;//允许结果为负数或不小于10的整数case '*':result=(a-'0')*(b-'0')+'0';break;case '/':result=(a-'0')/(b-'0')+'0';break;}return result;}int main(){SqStack OPTR,OPND;char ch,a,b,op;InitStack(OPTR);Push(OPTR,'#'); //OPTR为运算符栈,初始化时栈底字符为'#'InitStack(OPND);ch=getchar();//OPND为操作数栈,初始化时栈为空栈while(ch!='#' || GetTop(OPTR)!='#'){if(In_OPND(ch)) //当前字符为操作数,则进操作数栈{Push(OPND,ch);ch=getchar();}else//否则考虑当前字符与运算符栈顶字符的优先权,或当前字符进栈,或执行运算{switch(Compare(GetTop(OPTR),ch)){case '<'://运算符栈栈顶字符优先权小于当前字符,则当前字符进栈Push(OPTR,ch);ch=getchar();break;case '='://当前括号匹配,则运算符栈栈顶字符为'(',出栈。Pop(OPTR,op);ch=getchar();break;case '>'://运算符栈栈顶字符优先权大于当前字符,则执行该栈栈顶字符的运算。Pop(OPTR,op);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,op,b));break;}}}printf("%d\n",GetTop(OPND)-'0');//输出数允许为负数,0,以及不小于10的数return 0;}

原创粉丝点击