您的位置:首页 > 编程语言 > C语言/C++

c++中缀表达式转后缀表达式并计算

2017-03-05 16:03 369 查看
#include <iostream>
#include <stack>
using namespace std;

//栈内优先级
int isp(char a)
{
switch (a) {
case '+':
case '-':
return 3;
case '*':
case '/':
return 5;
case '(':
return 1;
case ')':
return 6;
case '#':
return 0;

default:
return -1;
break;
}
}

//栈外优先级
int icp(char a)
{
switch (a) {
case '+':
case '-':
return 2;
case '*':
case '/':
return 4;
case '(':
return 6;
case ')':
return 1;
case '#':
return 0;

default:
return -1;
break;
}
}

//计算函数
int cal(int a, int b, char c)
{
switch (c) {
case '+':
return b + a;
case '-':
return b - a;
case '*':
return b * a;
default:
return b / a;
}
}

char in_order_expression[1000];//中缀表达式
char post_order_expression[1000];//后缀表达式
stack<int> calculation;//计算的时候到栈
stack<char> tmp;//中缀改后缀的时候到过渡栈
int i = 0, j = 0;

int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";

cout << "请输入中缀表达式,并以#结尾" << endl;
cin >> in_order_expression;

//    for (int k = 0; in_order_expression[k] != '#'; k++) {
//        cout <<in_order_expression[k] << "  ";
//    }
tmp.push('#');
//    int a = 0;
//    for (a = 0; in_order_expression[a] != '#'; a++);
//    int len = a + 1;
while (!tmp.empty()) {
//如果是数字,直接输出到后缀表达式里
if (in_order_expression[i] >= '0' && in_order_expression[i] <= '9') {
post_order_expression[j++] = in_order_expression[i++];
}
else
{
//如果是符号的话,则根据isp和icp的大小执行相应的动作
if (icp(in_order_expression[i]) > isp(tmp.top())) {
tmp.push(in_order_expression[i++]);
}
//这里的i不能++,要保证出栈并输出之后还能继续对这个符号进行操作
else if (icp(in_order_expression[i]) < isp(tmp.top()))
{
post_order_expression[j++] = tmp.top();
tmp.pop();
}
//只有左右括号的时候会执行这个操作
else
{
tmp.pop();
}
}
cout << i << "次迭代成功" << endl;//做个标记
}
//计算部分i = 0;do {//如果是数字,直接入栈if (post_order_expression[i] >= '0' && post_order_expression[i] <= '9') {calculation.push(post_order_expression[i++] - '0');}else{//符号的话,就要根据符号的类型,计算栈中最上面两个数字的结果,然后再入栈,保证每次//计算的时候,栈里永远有两个数字int temp1 = calculation.top();calculation.pop();int temp2 = calculation.top();calculation.pop();calculation.push(cal(temp1, temp2, post_order_expression[i++]));}cout << i << "次计算成功" << endl;//做个标记}while (i < j);cout << calculation.top() << endl;return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: