首页 > 其他 > 详细

栈之后缀表达式

时间:2017-02-06 10:45:24      阅读:239      评论:0      收藏:0      [点我收藏+]

一、后缀表达式介绍

 

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

比如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;
}

 

栈之后缀表达式

原文:http://www.cnblogs.com/z360/p/6369031.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!