首页 > 编程 > C++ > 正文

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

2019-11-06 07:11:42
字体:
来源:转载
供稿:网友
#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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选