栈之后缀表达式

一、后缀表达式介绍

 

后缀表达式的特点就是计算机运算非常方便,需要用到栈;计算机处理过程只需要顺序读入,如果遇到数字,则放入栈中,如果是运算符,则将两个栈中数字取出进行运算;

比如1+2的后缀表达式为12+;

而栈可以把一般的中缀表达式变成后缀表达式,并且计算后缀表达式得出结果,因此此应用在计算器中非常常用;

 

二、中缀表达式转换成后缀表达式

 

此方法需要遵循几个规则:

(1)如果读入操作数,则直接放入输出字符串;

(2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低,则需要将栈顶的运算符放入输出字符串;

(3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低;

(4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串;

(5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串;

  

三、计算后缀表达式

 
 

规则如下:

(1)如果是操作数,则放入栈中;

(2)如果是操作符,则取出栈中两个操作数,进行运算后,将结果放入栈中;

(3)直到最后栈中只有一个元素,此元素就是计算结果;

 

四、代码

 

以下代码是计算器的辅助代码,通过此代码可以快速进行计算。

输入: 四则运算(支持括号)

输出:结果字符串

//后缀表达式 
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<strack>
using namespace std;
int strack[101];
char s[256];
int comp(char s[256])
{//后缀表达式无需判断其算数优先级,因为其运算符顺序都是已经整理好了的,在进行运算时只需遇到运算符局进行操作 
    int i=0,top=0,x,y;
    while(i<=stren(s)-2)//由于gets是从1开始读入的,所以需要-1,并且最后面的@是无用的只起停止输入的作用,所以再-1 
    {
        swhile(s[i])
        {
            case'+':stack[--top]+=stack[top+1];break;// 因为进行运算时需考虑将其运算后在放入栈中,所以将元素放入后 
            case'-':stack[--top]-=stack[top+1];break;//将指针下移一位,进行操作,这样就将运算获得数放入指针的位置 
            case'*':stack[--top]*=stack[top+1];break;
            case'/':stack[--top]/=stack[top+1];break;
            default:x=0;
            while(s[i]!='') x=x*10+s[i++]-'0';//将其转换成数字 
              stack[++top]=x;//把转换获得数字放入栈中 
              break;
        }
        i++;
    }
    return stack[top];
}int main()
{
    printf("input a string (@_over):");
    gets(s);//读入一个字符串 
    printf("result=%d",comp(s));
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/6369031.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值