第一步,我们需要将先写出栈和栈的运算函数
#include <bits/stdc++.h>
using namespace std;
typedef char Elem;
#define MAXSIZE 10000
//利用栈的原理计算简单表达式的值
//第一步,创建栈的结构类型和栈的运算函数
//创建用于存储栈的结构体类型
typedef struct{
Elem *data;
int top;
}Stack;
//初始化栈
void Init(Stack &S){
S.data = new Elem[MAXSIZE];
S.top = -1;
}
//讲Elem元素压入栈内
bool Push(Stack &S, Elem e){
if(S.top == MAXSIZE - 1){//栈满判断
return false;//栈满返回false
}
else{
S.data[++S.top] = e;//将元素压入栈中
return true;
}
}
//将栈顶元素弹出
bool Pop(Stack &S, Elem &e){
if(S.top == -1){
return false;
}
else{
e = S.data[S.top--];
return true;
}
}
//判断栈是否为空
bool IsEmpty(Stack &S){
return (S.top == -1);
}
//获取栈顶元素
bool GetTop(Stack &S, Elem &e){
if(S.top == -1){
return false;
}
else{
e = S.data[S.top];
return true;
}
}
//销毁栈
void DestroyStack(Stack &S){
Stack *r = &S;
free(r);
}
上面就是栈的结构体定义和栈的基本运算函数。
第二步,我们写出求后缀表达式的函数:
//将中缀表达式转化为后缀表达式(逆波兰表达式)
void trans(char exp[], char postexp[]){
char e;
Stack S;
Init(S);
int i = 0, j = 0;
while(exp[i] != '\0'){
switch(exp[i]){
case '('://当exp[i]为'('时,直接将exp[i]压入栈内即可
Push(S, '(');
i++;
break;
case ')'://当exp[i]为')'时,将栈内元素出栈直到栈顶为'('或者栈空时为止,注意:')'不入栈
Pop(S, e);
while(e != '('){
postexp[j++] = e;
Pop(S, e);
}
i++;
break;
case '-':
case '+':
//当exp[i]为'-'或者'+'时,将栈内所有元素出栈直到栈顶为'('或者栈空时才将exp[i]入栈
while(!IsEmpty(S)){//栈空判断
GetTop(S, e);//得到栈顶元素
if(e != '('){//栈顶元素是否为'('的判断
postexp[j++] = e;
Pop(S, e);
}
else{//当栈顶为'('时直接退出循环
break;
}
}
Push(S, exp[i]);//当栈内所有元素出栈直到栈顶为'('或者栈空时将exp[i]入栈
i++;//跳到下一个元素
break;
case '*':
case '/'://当exp[i]为'*'或者'/'时,将栈内元素出栈直到栈顶为'('、'+'、'-'或者栈空时才将exp[i]压入栈内
while(!IsEmpty(S)){//栈空循环
GetTop(S, e);//获取栈顶元素
if(e == '*' || e == '/'){
postexp[j++] = e;//将栈顶元素添加到postexp[i]字符串串尾
Pop(S, e);//将栈顶元素出栈
}
else{//当栈顶不为'*'、'/'中的任何一种时,即当栈顶运算符的优先级小于exp[i]时,退出循环
break;
}
}
Push(S, exp[i]);//栈空时或者栈顶运算符优先级小于exp[i]时,退出循环,并将exp[i]压入栈中
i++;
break;
default:
//将所有的数字添加到postexp字符数组中,并且在数字末尾添加'#'
while(exp[i] >= '0' && exp[i] <= '9'){
postexp[j++] = exp[i++];
}
postexp[j++] = '#';
}
}
while(!IsEmpty(S)){
Pop(S, e);
postexp[j++] = e;
}//将栈中的运算符全部出栈到postexp中
postexp[j] = '\0';//令字符串postexp最后一个元素为'\0',便于后续利用后缀表达式求值时的循环判断
DestroyStack(S);//销毁栈S
}
好了,这就是我们利用栈的特性求简单中缀表达式的后缀表达式的所有代码了,这也是我们利用栈进行简单表达式求值的第一步,也是关键的一步。注释都有并且很详细,我就不解释了(好像也没必要,毕竟CSDN上都是大神)。