|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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());
}
|
|