求助!!!DS栈—波兰式,逆波兰式

求助!!!(DS栈—波兰式,逆波兰式)


题目描述

表达式有三种表示方法,分别为:

前缀表示(波兰式):运算符+操作数1+操作数2

中缀表示:操作数1+运算符+操作数2

后缀表示(逆波兰式):操作数1+操作数2+运算符

例如:a +b * (c -d ) - e/f

波兰式:-+a*b-cd/ef     (运算符在操作数的前面,用递归计算波兰式)

中缀式:a+b*c-d-e/f  

逆波兰式:abcd-*+ef/   (运算符在操作数的后面,用栈计算逆波兰式)

 中缀表示就是原表达式去掉扣号。       

 根据表达式求波兰式、逆波兰式都是教材第三章表达式求值的思想。     

 求波兰式,需要操作数栈(注意不是计算结果入栈,有计算式入栈),运算符栈。
 
 区别在于从后往前扫描表达式,‘(’ 换成')','('换成‘)’。
 
 栈顶运算符优先级>新读入运算符优先级出栈,
 
 教材第三章表3.1中的相同运算符优先级>(从左往右计算)改为<,例如栈顶为‘+‘,新读入的为‘+’,则栈顶优先级<新读入的优先级。

 求逆波兰式,只需要运算符栈。操作数直接输出,操作符按表3.1优先级顺序出栈,输出。

  输入表达式,求其波兰式和逆波兰式。

输入
测试次数

每组测试数据一行,一个合法表达式

输出
对每组测试数据,输出两行

第一行,表达式的波兰表示

第二行,表达式的逆波兰表示

不同组测试数据间以空行分隔。

样例输入
2
4+23-10/5
12+3
5+(2+10)*5
样例输出
“- + 4 * 2 3 / 10 5”
“4 2 3 * + 10 5 / -”

“+ + 12 * 3 5 * + 2 10 5”
”12 3 5 * + 2 10 + 5 * +“

在这里插入图片描述
这里10和12之间应该是没用空格的
请问要怎么实现10 和 12的输出

#include <iostream>
#include <stack>
#include<string>
using namespace std;
int isNumber(char o)
{
    if (o == '0' || o == '1' || o == '2' || o == '3' || o == '4' || o == '5' || o == '6' || o == '7' || o == '8' || o == '9')
        return 1;
    else
        return 0;
}
int judge(char o)
{
    if (o == '*' || o == '/')
    {      
        return 2;
    }
    if (o == '+' || o == '-')
    {
        return 1;
    }
    if (o == '(' || o == ')')
        return 3;
    return 0;
}
int judge2(char o)
{
    if (o == '*' || o == '/')
    {
        return 2;
    }
    if (o == '+' || o == '-')
    {
        return 3;
    }
    if (o == '(' || o == ')')       
        return 1;
    return 0;
}
int main()
{
    int t;
    cin >> t;
    int key = 1;
    while (t--)
    {
        stack<char>temp;
        stack<char>op;
        stack<char>r;
        stack<char>res;
        string o;
        cin >> o;
        int len = o.length();
            for (int i = o.length()-1; i >= 0; i--) {
                if (o[i] >= '0' && o[i] <= '9') {
                    temp.push(o[i]);
                }
                else {
                    if (op.empty()|| o[i] == ')'|| op.top() == ')') {
                        op.push(o[i]);
                    }
                    else if (o[i] == '(') {
                        while (op.top() != ')') {
                            if (op.top() == '+' || op.top() != '-' || op.top() == '*' || op.top() == '/') {
                                temp.push(op.top());
                                op.pop();
                            }
                        };
                        op.pop();
                    }
                else if (o[i] == '*' || o[i] == '/' || o[i] == '+' || o[i] == '-') {
                    while (true) {
                        if (op.empty()){
                            op.push(o[i]);
                            break;
                        }
                        else if (judge2(o[i]) > judge2(op.top())) {
                            temp.push(op.top());
                            op.pop();
                        }
                        else if (judge2(o[i]) <= judge2(op.top())) {
                            op.push(o[i]);
                            break;
                        }
                    }
                }
            }
        }
        while (!op.empty())
        {
            temp.push(op.top());
            op.pop();
        }
        while (!temp.empty())
        {          
            r.push(temp.top());
            temp.pop();
        }
        while (!r.empty())
        {
                res.push(r.top());
                r.pop();
        }
        char a[20] = { 0 };
        int k = 0;
        while (!res.empty())
        {
               a[k]= res.top();
                res.pop();   
                k++;
        }
        for (int p = 0; p < len; p++)
        {    
            cout << a[p];     
        }
        cout << endl;

        for (int i = 0; i < o.length(); i++) {
            if (o[i] >= '0' && o[i] <= '9') {
                temp.push(o[i]);
            }
            else {
                if (op.empty()|| op.top() == '('|| o[i] == '(') {
                    op.push(o[i]);
                }             
                else if (o[i] == ')') {
                    while (op.top() != '(') {
                        if (op.top() == '+' || op.top() != '-' || op.top() == '*' || op.top() == '/') {
                            temp.push(op.top());
                            op.pop();
                        }
                    };
                    op.pop();
                }
                else if (o[i] == '*' || o[i] == '/' || o[i] == '+' || o[i] == '-') {
                    while (true) {
                        if (op.empty()) {
                            op.push(o[i]);
                            break;
                        }
                        else if (judge(o[i]) <= judge(op.top())) {
                            temp.push(op.top());
                            op.pop();
                        }
                        else if (judge(o[i]) >judge(op.top())) {
                            op.push(o[i]);
                            break;
                        }
                    }
                }
            }
        }
        while (!op.empty())
        {
            temp.push(op.top());
            op.pop();
        }
        while (!temp.empty())
        {
            r.push(temp.top());
            temp.pop();
        }
        char b[20] = { 0 };
        k = 0;
        while (!r.empty())
        {
            b[k] = r.top();
            r.pop();
            k++;
        }
        for (int p = 0; p < len; p++)
        {
                cout << b[p];         
        }
        cout << endl;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值