实在是不好意思啊 啊啊啊啊啊,这么久没有更新博客啦~~~
没想到吧,我来搞数据结构啦!
话不多说,直入主题。
逆波兰表达式又称后缀表达式,下举一些例子(中缀--->后缀):
a+b ---> a,b,+a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
算法思路:
0.搞出来两个栈分别为opStack(运算符栈)和tempStack(运算结果保存栈)。自己写的栈不想用了(因为这样会让程序显得很长显得我很牛逼但是我不想zhuangbility因为我连头文件都忘记如何写啦没想到吧哈哈哈),我就用了STL的stack,发现是如此的好用。
1.从左到右遍历字符数组tempStr(存储中缀表达式);
2.如果当前字符str[i](i是循环变量哟)是操作数(数字),直接tempStack.push(str[i]), 并读入下一个字符(i++);
3.如果当前字符是左括号'(',对不起一jio直接把它踢入运算符栈好吧:opStack.push(str[i])。 读入下一个字符(i++);
4.如果当前字符是右括号')',那就从opStack中依次弹出栈顶元素并把它打进tempStack的怀里,直到遇到左括号为止,
并把这对括号舍弃。 读入下一个字符(i++)。
5.如果当前字符是运算符时,需要比较opStack栈顶元素和当前字符str[i]的优先级。
5.1如果opStack.top()>str[i](>是指opStack.pop()的优先级高于str[i]的优先级),把opStack.top()弹出并压入tempStack中,回到5继续比较新的opStack.top()和str[i]的优先级;
5.2如果opStack.top()<str[i],把str[i]push进opStack中。
5.3如果opStack.top()==str[i],这是特殊情况,只有当i=strlen(str)-1(数组的最后一个元素)时才会发生,i++即可。
6.重复1~5直到中缀表达式结束。
7.将tempStack中的数据写入临时数组tempans中,倒序输出tempans即为最终的结果(后缀表达式啦~)。
下面是代码啦啦()!
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100;
bool is_op(char ch){
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')
return true;
return false;
}
int Convert(char c){
int ch;
switch (c){
case '+':
ch = 0;
break;
case '-':
ch = 1;
break;
case '*':
ch = 2;
break;
case '/':
ch = 3;
break;
case '(':
ch = 4;
break;
case ')':
ch = 5;
break;
case '#':
ch = 6;
break;
}
return ch;
}
char Precede(char a, char b){
const char Table[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', '!'},
{'>', '>', '>', '>', '!', '>', '>'},
{'<', '<', '<', '<', '<', '!', '='}};
return Table[Convert(a)][Convert(b)];
}
void Calculate_IPSE(char *str){///Ä沨À¼±í´ïʽInverse Poland suffix expression
//Trans(str);
stack<char> opStack;
stack<char> tempStack;
opStack.push('#');
int i = 0;
while (i < strlen(str)){
if (!is_op(str[i])){
tempStack.push(str[i]);
i ++;
}else{
if (str[i] == '('){
opStack.push(str[i]);
i ++;
}else
if (str[i] == ')'){
while (opStack.top() != '('){
tempStack.push(opStack.top());
opStack.pop();
}
opStack.pop();
i ++;
}else{
while (true){
if (Precede(opStack.top(), str[i]) == '>'){
tempStack.push(opStack.top());
opStack.pop();
continue;
}
if (Precede(opStack.top(), str[i]) == '<'){
opStack.push(str[i]);
i ++;
break;
}
if (Precede(opStack.top(), str[i]) == '='){
i ++;
break;
}
}
}
}
}
char tempans[Maxn];
int cou = 0;
while (!tempStack.empty()){
tempans[cou ++] = tempStack.top();
tempStack.pop();
}
for (int i = cou - 1; i >= 0; i--)
cout << tempans[i];
cout << endl;
}
int main(){
//char tempStr[Maxn] = "1+((2+3)*4)-5#";
char tempStr[Maxn];gets(tempStr);
Calculate_IPSE(tempStr);
return 0;
}
注:
1.Precede函数和Convert函数是为了比较优先级高低(打表哟)
2.这个程序只能处理0~9和运算符为+-*/()
3.需要在建栈时初始化opStack.push('#');#是我们定义的一个优先级最低的符号。
4.我写的不容易,快评论夸我一下吧,如果你不想夸我,那我,,,,我就,,,就,,,求你了。
还有一件事:我在网易云音乐上私信了我喜欢的女孩,如果她回复我我就去表白,如果没有,那就怪网易云。