数据结构之栈:后缀表达式(栈的应用)

表达式分为前缀表达式,中缀表达式,后缀表达式。

中缀表达式:指双目运算符在两个运算对象中间,如4+2。

那么后缀表达式和前缀表达式顾名思义就是了,也就是说后缀表达式的双目运算符在后,前缀表达式的双目运算符在前。

比如,中缀表达式4+2 转化为后缀表达式就是  4 2 + 

3 *(4+2)/2-5 对应的后缀表达式为        3  4 2 +  *  2 /  5 -  

转化的时候需要根据运算符的优先级。

优先级为: () *  /  +  -

转化的过程是:

先算括号内的 :4 2 +

再算乘法:  3  4 2 + * (注意,此时的 “4 2 +”就是一个数,只能作为一个整体,不能拆开 )

再算除法:此时的 3 4 2 + * 就是一个整体  再和2作除法运算 : 3 4 2 + * 2 /

(还需要注意的是,两个数谁在前谁在后,这种位置不能更改,如果写为  2 3 4 2 + * / 就把原来中缀表达式改变了 )

最后再算减法:3  4 2 +  *  2 /  5 -   

后缀表达式求值时,所有的计算按运算符出现的顺序进行,也就是从左到右进行,不用再考虑运算符的优先级。

下面先描述一下伪代码:

1、初始化栈。

2、从左到右开始扫描表达式,然后执行如下操作:

2.1  若当前字符是数字,那么入栈,继续扫描下一个字符;

2.2 若当前字符是运算符,那么从栈内出栈两个元素,执行运算并将运算结果入栈,继续扫描下一个字符。

3、输出栈顶的元素,也就是表达式的运算结果。

下面是代码,如有错误还请多多指教。

#include
using namespace std;

int calculate(int a,int b,char ch)
{
    switch (ch)
    {
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    }

}

int main()
{
    char opnd[10];
    int n;
    cout<<"请确定字符数组的长度,用来存放数字和运算符(以#结束):";
    cin>>n;
    char ch[n];
    int top1 =-1;
    for(int i=0; i>ch[i];
    }

    int i =0;
    do
    {
        if(ch[i]=='#')
            break;
        if(ch[i]>='0')
        {
            opnd[++top1] = ch[i];
            i++;
        }
        else if(ch[i]<'0')
        {
            int x1,x2;
            x1=opnd[top1--]-'0';//字符与数字之间的转化
            x2=opnd[top1--]-'0';
            opnd[++top1]=calculate(x2,x1,ch[i])+'0';
            i++;
        }
    }
    while (top1>=0);
    cout<<"最终结果是:"<

你可能感兴趣的:(数据结构)