该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include //含有int isdigit(int c)函数原形
#include
#include
#include"stack.h"
typedef char ElemType;
int Precedence(char op)//优先级判断
{
switch(op)
{
case'+':
case'-':
return 1;
case'*':
case'/':
return 2;
case'(':
case'@':
default:
return 0;
}
}
void Change(char *s1,char *s2)//将S1中缀表达式转换为s2后缀表达式
{
Stack r;
InitStack(r);
Push(r,'@');//给栈底放入@字符,它具有最低优先级
int i,j;
i=0;
j=0;
char ch=s1[i];
while(ch!='@')
{
if(ch==' ') ch=s1[++i];
else if(ch=='(')//对于左括号,直接进栈
{
//填空
}
else if(ch==')')//对于右括号,使括号内的仍停留在栈中的运算符依次出栈并写入s2
{
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
//对于运算符,则判断优先级,优先级大于栈顶元素入栈,否则栈顶元素出栈并输出直至当前运算符入栈
{
//填空
}
else//对于其他情况,即数字
{
//填空
}
}
//栈不为空,则栈中符号全部出栈并输出
if(!StackEmpty(r))
{
ch=Pop(r);
while(ch!='@')
{
//填空
}
}
s2[j++]='@';
s2[j++]='\0';
}
float Compute(char *str)//计算后缀表达式的结果
{
Stack S;
InitStack(S);
istrstream ins(str);
char ch;
float x;
ins>>ch;
while(ch!='@')
{//atof(Pop(S))
switch(ch)
{
case'+'://填空
break;
case'-'://填空
break;
case'*'://填空
break;
case'/':x=Pop(S);
if(x!=0)
x=Pop(S)/x;
else{
cerr<
exit(1);
}break;
default:
ins.putback(ch);
ins>>x;
}
Push(S,x);
ins>>ch;
}
if(!StackEmpty(S))
{
x=Pop(S);
if(StackEmpty(S))return x;
else
{
cerr<
exit(1);
}
}
else
{
cerr<
exit(1);
}
}