//求后缀表达式,用顺序栈实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
//初始化静态栈
S.top=-1;//将top指向栈顶元素
}
bool Push(SqStack &S,int x){
//往栈中添加元素
//判断栈满了吗
if(S.top==MaxSize-1)
return false;//栈满了
S.data[++S.top]=x;//S.top移动再填入元素,因为S.top是栈顶元素
return true;
}
bool Pop(SqStack &S,int &x){
//首先判断栈是否为空
if(S.top==-1)
return false;//栈为空
x=S.data[S.top--];//先拿走栈顶元素,再将top移动
return true;
}
//上述就是顺序栈的相关知识,接下来是给一个后缀表达式求后缀表达式
//难点,针对'12'这种状况:
void compute_postfix_expression(char str[],int &ret){//char str[],千万别忘了 {
//这里用的是引用,还可以用返回值
SqStack S;
InitStack(S);
int left,right,char_to_num,temp;
int i=0;
while(str[i]!='\0'){//遍历给的字符数组
char_to_num=0;
if(str[i]>='0' && str[i]<='9'){
//如果是数字'1','2','4',但是针对‘11’这种就要循环搞
while(str[i]>='0' && str[i]<='9'){
char_to_num=char_to_num*10+(str[i]-'0');
i++;
}
Push(S,char_to_num);
}else{
if(str[i]!=' '){
Pop(S,right);//后缀表达式先出为右操作数
Pop(S,left);
switch(str[i]){
case '+':
temp=left+right;
break;
case '-':
temp=left-right;
break;
case '*':
temp=left*right;
break;
case '/':
temp=left/right;
break;
}
Push(S,temp); //将过程中计算结果放入栈
}
}
i++;//千万别忘了
}
//后缀表达式最后值,在栈里
Pop(S,ret) ;
}
int main(){
char arr[] = "10 2 1 - 3 * +10 2 / +";
int ret;
compute_postfix_expression(arr,ret);
printf("%s=%d",arr,ret);
return 0;
}
注意后缀表达式,先出栈为右操作数。