#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define Maxsize 100 using namespace std; typedef int dataType; typedef struct Stack { dataType *top; dataType *base; int stacksize; }sqstack; void create(sqstack *s) { s->base=(dataType *)malloc(Maxsize*sizeof(dataType)); if(!s->base) { return; } s->top=s->base; s->stacksize=Maxsize; return; } int push_in(sqstack *s,dataType value) { if(s->top-s->base==s->stacksize) { return 0; } *s->top++=value; return 1; } int pop_out(sqstack *s,dataType *elem) { if(s->base==s->top) { return 0; } *elem=*--s->top; return 1; } dataType GetTop(sqstack *s) { if(s->base==s->top) { return 0; } return *(s->top-1); } char Precede(char theta1,char theta2) { int i,j; char pre[7][7]={// + - * / ( ) = {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','0'}, {'>','>','>','>','0','>','>'}, {'<','<','<','<','<','0','='}}; switch(theta1){ case '+': i=0; break; case '-': i=1; break; case '*': i=2; break; case '/': i=3; break; case '(': i=4; break; case ')': i=5; break; case '=': i=6; break; } switch(theta2){ case '+': j=0; break; case '-': j=1; break; case '*': j=2; break; case '/': j=3; break; case '(': j=4; break; case ')': j=5; break; case '=': j=6; break; } return(pre[i][j]); } int Operate(int a,char theta,int b) { int result; switch(theta){ case'+':return a+b; case'-':return a-b; case'*':return a*b; case'/': if(b!=0) return a/b; else { printf("Divisor can not Be zero!\n"); exit(0); } } } int In(char c) { switch(c){ cas
时间: 2023-06-13 08:08:17 浏览: 118
e '+': case '-': case '*': case '/': case '(': case ')': case '=': return 1; default: return 0; } } void EvaluateExpression() { sqstack OPTR,OPND; create(&OPTR); push_in(&OPTR,'='); create(&OPND); char c=getchar(); dataType x=0; while(c!='='||GetTop(&OPTR)!='=') { if(!In(c)) { ungetc(c,stdin); scanf("%d",&x); push_in(&OPND,x); } else { switch(Precede(GetTop(&OPTR),c)) { case '<': push_in(&OPTR,c); c=getchar(); break; case '=': pop_out(&OPTR,&c); c=getchar(); break; case '>': char theta; pop_out(&OPTR,&theta); dataType a,b; pop_out(&OPND,&b); pop_out(&OPND,&a); push_in(&OPND,Operate(a,theta,b)); break; } } } printf("%d",GetTop(&OPND)); } int main() { EvaluateExpression(); return 0; }
这段代码是一个简单的表达式求值程序,包括了栈的基本操作,如创建栈、入栈、出栈、取栈顶元素等。其中Precede函数用于比较两个运算符的优先级,Operate函数用于对两个操作数进行计算,In函数用于判断一个字符是否为运算符。EvaluateExpression函数则是主要的表达式求值函数,采用了两个栈,一个用于存储运算符,一个用于存储操作数。整个程序的核心思想是利用栈来实现中缀表达式的转换和求值。