是你的栈啊-求你了告诉我逆波兰表达式

实在是不好意思啊 啊啊啊啊啊,这么久没有更新博客啦~~~


没想到吧,我来搞数据结构啦!

话不多说,直入主题。

逆波兰表达式又称后缀表达式,下举一些例子(中缀--->后缀):

a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+

a+d*(b-c)--->a,d,b,c,-,*,+

算法思路:

0.搞出来两个栈分别为opStack(运算符栈)和tempStack(运算结果保存栈)。自己写的栈不想用了(因为这样会让程序显得很长显得我很牛逼但是我不想zhuangbility因为我连头文件都忘记如何写啦没想到吧哈哈哈),我就用了STL的stack,发现是如此的好用。

1.从左到右遍历字符数组tempStr(存储中缀表达式);

2.如果当前字符str[i](i是循环变量哟)是操作数(数字),直接tempStack.push(str[i]), 并读入下一个字符(i++);

3.如果当前字符是左括号'(',对不起一jio直接把它踢入运算符栈好吧:opStack.push(str[i])。 读入下一个字符(i++);

4.如果当前字符是右括号')',那就从opStack中依次弹出栈顶元素并把它打进tempStack的怀里,直到遇到左括号为止,

并把这对括号舍弃。 读入下一个字符(i++)。

5.如果当前字符是运算符时,需要比较opStack栈顶元素和当前字符str[i]的优先级。

    5.1如果opStack.top()>str[i](>是指opStack.pop()的优先级高于str[i]的优先级),把opStack.top()弹出并压入tempStack中,回到5继续比较新的opStack.top()和str[i]的优先级;

    5.2如果opStack.top()<str[i],把str[i]push进opStack中。

    5.3如果opStack.top()==str[i],这是特殊情况,只有当i=strlen(str)-1(数组的最后一个元素)时才会发生,i++即可。

6.重复1~5直到中缀表达式结束。

7.将tempStack中的数据写入临时数组tempans中,倒序输出tempans即为最终的结果(后缀表达式啦~)。

下面是代码啦啦()!

#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100;

bool is_op(char ch){
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')
        return true;
    return false;
}
int Convert(char c){
    int ch;
    switch (c){
        case '+':
            ch = 0;
            break;
        case '-':
            ch = 1;
            break;
        case '*':
            ch = 2;
            break;
        case '/':
            ch = 3;
            break;
        case '(':
            ch = 4;
            break;
        case ')':
            ch = 5;
            break;
        case '#':
            ch = 6;
            break;
    }
    return ch;
}
char Precede(char a, char b){
    const char Table[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
                              {'>', '>', '<', '<', '<', '>', '>'},
                              {'>', '>', '>', '>', '<', '>', '>'},
                              {'>', '>', '>', '>', '<', '>', '>'},
                              {'<', '<', '<', '<', '<', '=', '!'},
                              {'>', '>', '>', '>', '!', '>', '>'},
                              {'<', '<', '<', '<', '<', '!', '='}};
    return Table[Convert(a)][Convert(b)];
}
void Calculate_IPSE(char *str){///Ä沨À¼±í´ïʽInverse Poland suffix expression
    //Trans(str);
    stack<char> opStack;
    stack<char> tempStack;
    opStack.push('#');
    int i = 0;
    while (i < strlen(str)){
        if (!is_op(str[i])){
            tempStack.push(str[i]);
            i ++;
        }else{
            if (str[i] == '('){
                opStack.push(str[i]);
                i ++;
            }else
            if (str[i] == ')'){
                while (opStack.top() != '('){
                    tempStack.push(opStack.top());
                    opStack.pop();
                }
                opStack.pop();
                i ++;
            }else{
                while (true){
                    if (Precede(opStack.top(), str[i]) == '>'){
                        tempStack.push(opStack.top());
                        opStack.pop();
                        continue;
                    }
                    if (Precede(opStack.top(), str[i]) == '<'){
                        opStack.push(str[i]);
                        i ++;
                        break;
                    }
                    if (Precede(opStack.top(), str[i]) == '='){
                        i ++;
                        break;
                    }

                }
            }

        }
    }
    char tempans[Maxn];
    int cou = 0;
    while (!tempStack.empty()){
        tempans[cou ++] = tempStack.top();
        tempStack.pop();
    }
    for (int i = cou - 1; i >= 0; i--)
        cout << tempans[i];
    cout << endl;
}

int main(){
    //char tempStr[Maxn] = "1+((2+3)*4)-5#";
    char tempStr[Maxn];gets(tempStr);
    Calculate_IPSE(tempStr);
    return 0;
}



注:

1.Precede函数和Convert函数是为了比较优先级高低(打表哟)

2.这个程序只能处理0~9和运算符为+-*/()

3.需要在建栈时初始化opStack.push('#');#是我们定义的一个优先级最低的符号。

4.我写的不容易,快评论夸我一下吧,如果你不想夸我,那我,,,,我就,,,就,,,求你了。



还有一件事:我在网易云音乐上私信了我喜欢的女孩,如果她回复我我就去表白,如果没有,那就怪网易云。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值