利用STL栈将中缀表达式转换成后缀表达式输出

#include <iostream>
#include <stack>
#include <string>
using namespace std;
int isp(char ch)
{
    switch(ch)
    {
        case'#':return 0;
        case'(':return 1;
        case'*':
        case'/':
        case'%':
            return 5;
        case'+':
        case'-':
                return 3;
        case')':
            return 6;
    }
}
int icp(char ch)
{
    switch(ch)
    {
        case'#':return    0;
        case'(':return 6;
        case'*':
        case'/':
        case'%':
            return 4;
        case'+':
        case'-':
                return 2;
        case')':
            return 1;
    }
}
int main()
{
    stack<string> x;
    stack<char>   s;
    char ch1='#';
    double operand;
    s.push(ch1);
    cin.get(ch1);
    while(!s.empty()&&ch1!='#')
    {
        if(isdigit(ch1)) {cin.putback(ch1);cin>>operand;(cout<<operand<<" ";cin.get(ch1);}            //判断是否是数字,若是数字,则输出
        else {
            if(icp(ch1)>isp(s.top())) {s.push(ch1);cin.get(ch1);}    //如果栈外icp>栈内isp  ,压栈且读入下一个字符
            else if(icp(ch1)<isp(s.top())){cout<<s.top()<<" ";s.pop();}     //如果栈外icp<栈内isp,输出栈顶元素并退栈
            else if(icp(ch1)==isp(s.top())){                     //如果icp>isp,1--如果栈顶元素为“(”,则退栈,并读入下一个元素
                                                                //              2--如果栈顶元素不为“(”,仅仅退栈;
                if(s.top()=='(') cin.get(ch1);
                s.pop();
            }
        }


    }
    cout<<"循环结束"<<endl;
        //cout<<s.top()<<endl;
        cin.get();

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用C++ STL中的来实现中缀表达式转后缀表达式,可以按照以下步骤进行: 1. 创建一个空的,用于存储运算符。 2. 遍历中缀表达式的每个字符: - 如果是操作数(数字),直接将其输出后缀表达式。 - 如果是左括号 '(',将其推入中。 - 如果是右括号 ')',则将中的运算符依次弹出并输出后缀表达式,直到遇到左括号 '('。注意:左括号 '('不输出后缀表达式,也不入。 - 如果是运算符 (+, -, *, /, ^),则: - 如果为空,或者顶元素为左括号 '(',则将运算符推入中。 - 否则,比较当前运算符与顶运算符的优先级。如果当前运算符的优先级小于或等于顶运算符的优先级,则将顶运算符弹出并输出后缀表达式,直到为空或者顶运算符为左括号 '(',然后将当前运算符推入中。 3. 遍历完中缀表达式后,如果中还有运算符,依次弹出并输出后缀表达式。 下面是一个用C++ STL中的实现中缀转后缀的示例代码: ```cpp #include <iostream> #include <stack> #include <string> int getPriority(char op) { if (op == '+' || op == '-') return 1; else if (op == '*' || op == '/') return 2; else if (op == '^') return 3; else return 0; } std::string infixToPostfix(const std::string& infix) { std::stack<char> opStack; std::string postfix; for (char ch : infix) { if (isdigit(ch)) { postfix += ch; } else if (ch == '(') { opStack.push(ch); } else if (ch == ')') { while (!opStack.empty() && opStack.top() != '(') { postfix += opStack.top(); opStack.pop(); } if (!opStack.empty() && opStack.top() == '(') { opStack.pop(); } } else { while (!opStack.empty() && getPriority(ch) <= getPriority(opStack.top())) { postfix += opStack.top(); opStack.pop(); } opStack.push(ch); } } while (!opStack.empty()) { postfix += opStack.top(); opStack.pop(); } return postfix; } int main() { std::string infix = "5 + 2 * (3 - 1)"; std::string postfix = infixToPostfix(infix); std::cout << "Infix expression: " << infix << std::endl; std::cout << "Postfix expression: " << postfix << std::endl; return 0; } ``` 在上述示例中,我们定义了一个`getPriority`函数来获取运算符的优先级。`infixToPostfix`函数使用一个循环来遍历中缀表达式的每个字符,并根据字符的类型执行相应的操作。最后,我们通过调用`infixToPostfix`函数将中缀表达式转换为后缀表达式,并输出结果。 希望这个示例能帮助你理解如何使用C++ STL中的来实现中缀表达式转后缀表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值