关注公众号程序猿从入门到入土查询更方便哦
栈的应用
#include<iostream>
#include<stack>
using namespace std;
int Calculate_Func(int n1, char opt, int n2);
int main() {
//创建两个栈
stack<char> optstack;
stack<int> numstack;
//初数化符号栈
optstack.push('#');
char ch;
ch = getchar();
char ctemp;
char ntemp1, ntemp2;
while (ch != '#') {
if (ch <= '9' && ch >= '0') {
numstack.push(ch-'0');
}
if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '*' || ch == '/' || ch == '+' || ch == '-' || ch == '{' || ch == '}') {
switch (ch) {
//左括号直接入栈
case '{':
optstack.push(ch);
break;
case '[':
optstack.push(ch);
break;
case '(':
optstack.push(ch);
break;
case '}':
//提出运算符
ctemp = optstack.top();
optstack.pop();
while (ctemp != '{') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
ctemp = optstack.top();
optstack.pop();
}
if (ctemp == '[' || ctemp == '(') {
cout << 0;
return 0;
}
break;
case ']':
//提出运算符
ctemp = optstack.top();
optstack.pop();
while (ctemp != '[') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
ctemp = optstack.top();
optstack.pop();
}
if (ctemp == '{' || ctemp == '(') {
cout << 0;
return 0;
}
break;
case ')':
//提出运算符
ctemp = optstack.top();
optstack.pop();
while (ctemp != '(') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
ctemp = optstack.top();
optstack.pop();
}
if (ctemp == '{' || ctemp == '[') {
cout << 0;
return 0;
}
break;
case '+':
//提出运算符
ctemp = optstack.top();
optstack.pop();
if (ctemp == '(' || ctemp == '{' || ctemp == '[' || ctemp == '+' || ctemp == '-') {
optstack.push(ctemp);
optstack.push(ch);
}
else {
while (ctemp == '*' || ctemp == '/') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
ctemp = optstack.top();
optstack.pop();
}
//将原运算符与新运算符压入栈顶
optstack.push(ctemp);
optstack.push(ch);
}
break;
case '-':
//提出运算符
ctemp = optstack.top();
optstack.pop();
if (ctemp == '(' || ctemp == '{' || ctemp == '[' || ctemp == '+' || ctemp == '-') {
optstack.push(ctemp);
optstack.push(ch);
}
else {
while (ctemp == '*' || ctemp == '/') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
ctemp = optstack.top();
optstack.pop();
}
if (ctemp == ch) {
optstack.push(ctemp);
optstack.push('+');
break;
}
//将原运算符与新运算符压入栈顶
optstack.push(ctemp);
optstack.push(ch);
}
break;
case '*':
optstack.push(ch);
break;
case '/':
optstack.push(ch);
break;
}
}
ch = getchar();
}
//检查栈内容
/*while (!optstack.empty()) {
cout << optstack.top() << endl;
optstack.pop();
}
while (!numstack.empty()) {
cout << numstack.top() << endl;
numstack.pop();
}*/
while (optstack.top() != '#') {
//取出两个数字
ntemp1 = numstack.top();
numstack.pop();
ntemp2 = numstack.top();
numstack.pop();
//取出运算符
ctemp = optstack.top();
optstack.pop();
//计算
numstack.push(Calculate_Func(ntemp1, ctemp, ntemp2));
}
cout << numstack.top() << endl;
return 0;
}
int Calculate_Func(int n1, char opt, int n2) {
switch (opt) {
case '+':
return n1 + n2;
case '-':
return n2 - n1;
case '*':
return n1 * n2;
case '/':
return n2 / n1;
}
}