后缀表达式的求值
顺序扫描表达式中的每一项
若为操作数,则压入栈中;
若为运算符
则连续从栈中pop出两个操作数,
Y和X(后出栈op先出栈),并将计算结果重新压入栈中。
当表达式的所有项都扫描并处理完后,
栈顶存放的就是最后的计算结果
//后缀表达式的计算
/*顺序扫描表达式中的每一项
若为操作数,则压入栈中;
若为运算符
则连续从栈中pop出两个操作数,
Y和X(后出栈op先出栈),并将计算结果重新压入栈中。
当表达式的所有项都扫描并处理完后,
栈顶存放的就是最后的计算结果
*/
//栈的顺序存储结构,用静态数组实现
#include<stdio.h>
#include<string.h>
#define MaxSize 40//定义栈中元素的最大个数
#define ElemType int
typedef struct{
ElemType data[MaxSize];//存放栈中的元素
int top;//栈顶指针
}SqStack;//顺序栈
void InitStack(SqStack &s){
s.top=-1;//初始化栈顶指针
}
bool StackEmpty(SqStack s){
return s.top==-1;
}
bool Push(SqStack &s,ElemType x){
if(s.top == MaxSize-1){
printf("overflow\n");
return false;
}
s.data[++s.top]=x;
return true;
}
bool Pop(SqStack &s,ElemType &x){
//先判断栈是否为空
if(!StackEmpty(s)){
x = s.data[s.top--];
return true;
}
}
bool GetTop(SqStack s,ElemType &x){
//先判断栈是否为空
if(!StackEmpty(s)){
x = s.data[s.top];
return true;
}
}
bool DestroyStack(SqStack &s){
s.top=-1;
}
bool PrintStack(SqStack s){
int p=s.top;
if(p==-1){
printf("\n栈空\n");
return false;
}
printf("Stack is :");
while(p!=-1){
printf("%d ",s.data[p--]);
}
printf("\n");
}
bool isDigit(char c){
return (c>='0'&&c<='9');
}
bool isAlpha(char c){
return ((c>='a'&& c<='z')||(c>='A'&&c<='Z'));
}
int CharToNum(char c){
return (c-'0');
}
//输入后缀表达式字符串,和其长度,求最终结果
int SuffixToSum(char str[],int len){
SqStack s;
InitStack(s);
char ch;
int sum=0;
for(int i=0;i<len;i++){
ch=str[i];
//如果此字符是0~9
if(isDigit(ch)){
sum = sum*10 + CharToNum(ch);
if(str[i+1]==' '){//如果下一个为空格,则说明此数字结束
Push(s,sum);//说明此操作数组合结束,则将操作数入栈
sum=0;//并将sum置零
}
}
else if(ch==' '){//为空格则继续下一个循环
continue;
}
else{//说明是操作数
int x,y,result;
switch(ch){
case '+':
Pop(s,x);Pop(s,y);
result=y+x;break;
case '-':
Pop(s,x);Pop(s,y);
result=y-x;break;
case '*':
Pop(s,x);Pop(s,y);
result=y*x;break;
case '/':
Pop(s,x);Pop(s,y);
result=y/x;break;
}
Push(s,result);//将计算结果重新入栈
}
}
int finalResult;
Pop(s,finalResult);
return finalResult;
}
int main(){
char str0[30]="((15/(7-(1+1)))*3)-(4+(4+8))";
char str1[50]="15 7 1 1 + - / 3 * 4 4 8 + + -";
printf("后缀表达式为:");
for(int i=0;i<strlen(str1);i++){
printf("%c",str1[i]);
}
printf("\n其对应的中缀表达式为:");
for(int i=0;i<strlen(str0);i++){
printf("%c",str0[i]);
}
int x;
x=SuffixToSum(str1,strlen(str1));
printf("\n\n结果为:%d\n",x);
return 0;
}