栈的应用:波兰表达式
今天先更新波兰表达式,后面再更新中缀表达式和逆波兰表达式
什么是波兰表达式
也叫前缀表达式。举例:1 + (2 + 3) × 4 - 5,这是人为计算采用的表达式,但是对于计算机来说,这样的计算很难,所以我们将他转化为前缀或后缀。
前缀表达式(波兰式):- + 1 × + 2 3 4 5
中缀表达式:1 + (2 + 3) × 4 - 5
后缀表达式(逆波兰式):1 2 3 + 4 × + 5 -
如何得到?
我们可以画出对应的二叉树,分别对应前中后序遍历
1 + (2 + 3) × 4 - 5可以画出二叉树:
中缀和后缀分别对应中序和后序遍历即可
实现波兰式
很容易看到:- + 1 × + 2 3 4 5 这个式子的特点,从右向左遍历,遇到数字则入栈,遇到运算符号就将栈顶以及次栈顶元素运算,将运算后的结果作为新的栈顶元素
① 5 4 3 2 入栈
②遇到+,2+3=5,5替换为新的栈顶,此刻栈内5 4 5
③遇到×,5×4=20,20替换为新的栈顶,此刻栈内 5 20
④遇到1,入栈,此刻栈内5 20 1
⑤遇到+,1+20=21,21替换为新的栈顶,此刻栈内5 21
⑥遇到-,21-5=16,16替换为新的栈顶,运算完毕
代码
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
struct stack {
struct stack* next;
struct stack* top;
int info;
};
int operate(int a, int b, char operat)//执行运算功能
{
int res;
switch (operat)
{
case '+':
res = a + b;
break;
case '-':
res = a - b;
break;
case '*':
res = a * b;
break;
case '/':
res = a / b;
break;
}
return res;
}
int Toint(char x)//将输入的符号0-9转换成对应的数字0-9
{
int n;
switch (x)
{
case '0':
n = 0;
break;
case '1':
n = 1;
break;
case '2':
n = 2;
break;
case '3':
n = 3;
break;
case '4':
n = 4;
break;
case '5':
n = 5;
break;
case '6':
n = 6;
break;
case '7':
n = 7;
break;
case '8':
n = 8;
break;
case '9':
n = 9;
break;
}
return n;
}
struct stack* InitStack()
{
struct stack* s;
s = new stack;
s->top = new stack;
s->top->next = nullptr;
return s;
}
struct stack* PushStack(struct stack* s, int data)
{
struct stack* s1;
s1 = new stack;
s->top->info = data;
s1->next = s->top;
s->top = s1;
return s;
}
struct stack* PopStack(struct stack* s,char operat)
{
struct stack* s1;
s1 = new stack;
s1 = s->top->next;
int a = s->top->next->info;
int b = s->top->next->next->info;
s->top->next->next->info = operate(a, b, operat);
s->top->next = s->top->next->next;
free(s1);
return s;
}
void calculate()//功能函数
{
struct stack* s;
s = new stack;
s = InitStack();
char str[20];
int x;
for (int i = 0; i < 20; i++)
{
str[i] = '@';//初始化数组为@符号
}
for (int j = 0; ; j++)
{
cin >> str[j];
if (str[j] == '!')//以输入!表示结束
break;
}
for (int k = 20; k >= 0; k--)
{
if (str[k] >= '0' && str[k] <= '9')
{
x = Toint(str[k]);
s = PushStack(s, x);
}
else if (str[k] == '+' || str[k] == '-' || str[k] == '+' || str[k] == '*' || str[k] == '/')
{
s = PopStack(s,str[k]);
if (k==0)
cout << "运算结果是:" << s->top->next->info << endl;
}
}
}
int main()
{
calculate();
system("pause");
return 0;
}