表达式求值问题的计算/eg.3*9/5(2-11)
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define TURE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态的代码
typedef int Status;
//使用两个栈来分别存放操作数和操作符
//2.5 算术表达式求值演示
//参考教科书中P52 3.2.5 表达式求值
//栈的表示与实现参照教科书中P46 - 47
//======== ADT Stack 的表示与实现 =========
//-------- 栈的顺序存储表示 ---------
#define STACK_INIT_SIZE 100; //存储空间初始分配量
#define STACKINCREMENT 10; //存储空间分配增量
typedef struct {
int * base;
int * top;
int stacksize;
}SqStack;
//-------基本操作的函数原型说明---------
Status InitStack(SqStack &S);
//构造一个空栈
Status DestroyStack(SqStack &S);
//销毁栈S,S不再存在
Status ClearStack(SqStack &S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TURE,否则返回FLASE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S,int &e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack &S,int &e);
//插入元素e为新的栈顶元素
Status Pop(SqStack &S,int &e);
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S,Status(* visit)());
//从栈底到栈顶依次对栈中的每个元素调用函数visit().一旦visit()失败,则操作失败
//----------基本操作的算法描述-------------
Status InitStack(SqStack &S){
//构造一个空栈
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) return(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}// InitStack
Status DestroyStack(SqStack &S){
//销毁栈S,S不再存在
}
Status ClearStack(SqStack &S){
//把S置为空栈
}
Status StackEmpty(SqStack S){
//若栈S为空栈,则返回TURE,否则返回FLASE
}
int StackLength(SqStack S){
//返回S的元素个数,即栈的长度
}
Status GetTop(SqStack S,int &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,int &e){
//插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
S.base = (int *)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof (int));
if(!S.base) return(OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//Push
Status Pop(SqStack &S,int &e){
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}//Pop
//以上的栈用来存放操作数,所以元素类型为 int
typedef struct {
char * base;
char * top;
int stacksize;
}SqStack;
//-------基本操作的函数原型说明---------
Status InitStack(SqStack &S);
//构造一个空栈
Status DestroyStack(SqStack &S);
//销毁栈S,S不再存在
Status ClearStack(SqStack &S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TURE,否则返回FLASE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S,char &e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack &S,char &e);
//插入元素e为新的栈顶元素
Status Pop(SqStack &S,char &e);
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S,Status(* visit)());
//从栈底到栈顶依次对栈中的每个元素调用函数visit().一旦visit()失败,则操作失败
//----------基本操作的算法描述-------------
Status InitStack(SqStack &S){
//构造一个空栈
S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}// InitStack
Status DestroyStack(SqStack &S){
//销毁栈S,S不再存在
}
Status ClearStack(SqStack &S){
//把S置为空栈
}
Status StackEmpty(SqStack S){
//若栈S为空栈,则返回TURE,否则返回FLASE
}
int StackLength(SqStack S){
//返回S的元素个数,即栈的长度
}
Status GetTop(SqStack S,char &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,char &e){
//插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
S.base = (char *)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof (char));
if(!S.base) exit (OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//Push
Status Pop(SqStack &S,char &e){
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}//Pop
char Precede(char cleft,char cright)
{
//判断运算符栈的栈顶运算符与读入运算符的优先关系
int r[2];
int jielun;
char csearch=cleft;
for(int i=0;i<2;i++)
{
if(i==1) csearch=cright;
switch(csearch){
case '+' :
r[i] = 0 ; break;
case '-' :
r[i] = 1 ; break;
case '*' :
r[i] = 2 ; break;
case '/' :
r[i] = 3 ; break;
case '(' :
r[i] = 4 ; break;
case ')' :
r[i] = 5 ; break;
case '#' :
r[i] = 6 ; break;
}
}
int bijiao[7][7]={{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
for (int j=0;j<7;j++)
for(int k=0;k<7;k++)
{
if(j==r[0]&&k==r[1])
{
jielun=bijiao[j][k];
break;
}
}
char jieguo;
switch(jielun){
case -1 : jieguo = '<' ; break;
case 0 : jieguo = '=' ; break;
case 1 : jieguo = '>' ; break;
case 2 : jieguo = ' ' ; break;
};
/*///////////////////////////
char jieguo1;
for (int j1=0;j1<7;j1++)
{
for(int k1=0;k1<7;k1++)
{
switch(bijiao[j1][k1]){
case -1 : jieguo1 = '<' ; break;
case 0 : jieguo1 = '=' ; break;
case 1 : jieguo1 = '>' ; break;
case 2 : jieguo1 = ' ' ; break;
};
cout<<jieguo1<<" ";
}
cout<<endl;
}
//////////////////////////*/
return jieguo;
}
int Operate(int operleft,char theta,int operright)
{
//此段程序用来计算结果
//传入的operleft与operright是字符型
//需要强制类型转换为整型
int result;
switch(theta){
case '+' : result=operleft + operright;break;
case '-' : result=operleft - operright;break;
case '*' : result=operleft * operright;break;
case '/' : result=operleft / operright;break;
}
return result;
}
OperandType EvaluateExpression() {
//算术表达式求值的算符优先算法.设OPTR和OPND分别为运算符栈和运算数栈
//OP为运算符集合
InitStack(OPTR); Push(OPTR, '#');
InitStack(OPND); c = getchar();
while(c!='#' || GetTop(OPTR)!='#'){
if(!IN(c,OP){Push((OPND,c);c = getchar()} //不是运算符则进栈
else
switch(Precede(GetTop(OPTR),c){
case '<' : //栈顶元素优先权低
Push(OPTR,c); c = getchar();
break;
case '=' : //脱括号并接收下一字符
Pop(OPTR,x); c = getchar();
break;
case '>' : //退栈并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
}//switch
}//while
return GetTop(OPND);
}//EvaluateExpression
void main()
{
}