|  | 
 
| 
对简单的算术表达式求值。运算符包括+,-,*,/,(,),#。参加运算的数均为整数。
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 特别说明:
 
 1)实验课请按照数据结构(C语言版)p53页算法3.4直接进行改编。算法的要求与编程实现尽量与教材上的算法基本一致。
 
 2)要实现算法3.4,还需要编写的函数如下:初始化栈函数--InitStack()函数,入栈函数--Push()函数,取栈顶元素函数--GetTop()函数,运算符判断函数--In()函数,运算符优先级判断函数--Precede()函数,出栈函数--Pop()函数,运算操作函数--Operate()函数。
 
 输入
 输入一个简单的算术表达式,并以“#”号结束,如输入表达式:3*(7-2)#
 
 考虑一行输入数据即可,不必考虑多行输入。
 
 输出
 输出表达式对应的运算结果。如上面输入表达式的运算结果为:15
 
 样例输入 Copy
 3*(7-2)#
 样例输出 Copy
 15
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <iostream>
 using namespace std;
 #define OK 1
 #define ERROR 0
 #define OVERFLOW - 2
 #define MAXSIZE  5 //顺序栈存储空间的初始分配量
 typedef int Status;
 typedef char SElemType;
 
 
 typedef struct{
 SElemType *base;
 SElemType *top;
 int stacksize;
 }SqStack;
 
 Status InitStack(SqStack &s){
 s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
 if(!s.base)
 exit(OVERFLOW); //存储分配失败
 s.top = s.base; //top初始为base,空栈
 s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
 return OK;
 }//InitStack
 
 Status Push(SqStack &s, SElemType e){
 if(s.top-s.base==s.stacksize)return ERROR;
 *s.top++=e;
 return OK;
 }//Push
 
 Status Pop(SqStack &s, SElemType &e){
 if(s.base == s.top) return ERROR;
 e = *--s.top;
 return OK;
 }//Pop
 
 SElemType GetTop(SqStack s){
 if(s.base == s.top) return ERROR;
 return *--s.top;
 }//GetTop
 
 Status In(SElemType c){
 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')'||c=='['||c==']')
 return OK;
 else
 return ERROR;
 }//In
 
 char Precede(SElemType a, SElemType b){
 if(a=='+'||a=='-'){
 if(b=='+'||b=='-'||b==')'||b==']')
 return '>';
 else return '<';
 }
 if(a=='*'||a=='/'){
 if(b=='('||b=='[')
 return '<';
 else return '>';
 }
 if(a=='('){
 if(b==')')
 return '=';
 else return '<';
 }
 if(a=='['){
 if(b==']')
 return '=';
 else return '<';
 }
 if(a=='#'){
 if(b=='#')
 return '=';
 else return '<';
 }
 }//Precede
 
 SElemType Operate(SElemType a, SElemType x, SElemType b){
 switch (x){
 case '+':
 return a  + b;
 case '-':
 return a  - b;
 case '*':
 return a * b;
 case '/':
 return a / b;
 }
 }//Operator
 char EvaluateExpression(){
 SqStack OPTR, OPND;
 InitStack(OPTR);
 InitStack(OPND); //操作符
 Push(OPTR, '#');//操作数
 char ch,x,theta;
 cin>>ch;
 while(ch != '#' || GetTop(OPTR)!='#'){
 if(!In(ch))
 {
 Push(OPND,ch);
 cin>>ch;
 }
 else
 switch(Precede(GetTop(OPTR), ch))
 {
 case '<':
 Push(OPTR,ch);cin>>ch;
 break;
 case '>':
 Pop(OPTR,theta);
 SElemType a, b;
 Pop(OPND, b); Pop(OPND, a);
 Push(OPND, Operate(a, theta, b));
 break;
 case '=':
 Pop(OPTR, x);
 cin>>ch;
 break;
 }
 }
 return GetTop(OPND);
 }//EvaluateExpression
 int main()
 {
 SqStack S;
 InitStack(S);
 printf("%c",EvaluateExpression());
 }
 
 
 | 
 |