---中缀表达式转换为后缀表达式---模拟计算器-----堆栈

中缀转后缀表达式及计算
本文介绍了一种使用栈将中缀表达式转换为后缀表达式的方法,并详细解释了转换过程中的关键步骤。同时,文章还提供了一个完整的C++实现代码示例,演示如何利用栈进行中缀到后缀的转换以及表达式的计算。

中缀表达式转换为后缀表达式是堆栈的一个典型例题 . 

→ 从头到尾读取中缀表达式的每个对象,对不同的对象按照不同的情况处理.

①运算数:直接输出;

②左括号:压入堆栈;

③右括号:将栈顶的元算服弹出并输出直到遇见左括号(出栈不输出);

④运算符:

       若优先级大于栈顶运算符时压栈;

       若优先级小于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,知道该运算符大于栈顶运算符优先级为止,然后将运算符压栈;

⑤若各对象处理完毕,则把堆栈中保留的运算符一并输出.\        

      堆栈有很多的用途,例如函数的调用,在调用函数的的时候,就将调用函数的上一层储存到  栈里面,,所以当用函数的递归的时候就会占用很多的内存,容易导致崩溃,,,前面说过这个问题的例子.

下面附上实现代码

可能看起来比较困难一点,但是不要着急,先看看混个脸熟

#include<stdio.h>
#include<string.h>
#include<stack>
#include<stdlib.h>
using namespace std;

char a[1010];
char b[1010];
stack <char> s1;
stack <float> s2;

int i,j,n,m,t;
float x,y,z;

int fun(char x)
{
    switch(x)
    {
        case '+' :
        case '-' :return 1;
        case '*' :
        case '/' :return 2;
        case '(' :return 0;
        default  :return -1;
    }
}

float js(float x,float y,char z)
{
    switch(z)
    {
        case '+':return y+x;
        case '-':return y-x;
        case '*':return y*x;
        default :return y/x;
    }
}

int main()
{
    int p;
    char c[1010];
    float d;
    scanf("%d",&t);
    s1.push('#');
    while(t--)
    {
        j=0;
        scanf("%s",a);
        m=strlen(a)-1;
        for(i=0;i<m;i++)
        {
            if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
            {
                memset(c,0,sizeof(c));
                p=0;
                while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
                {
                    b[j++]=a[i];
                    c[p++]=a[i++];
                }
                d=atof(c);
                s2.push(d);
                i--;
            }

            else if(a[i]=='(')  s1.push(a[i]);

            else if(a[i]==')')
            {
                while(s1.top()!='(')
                {
                    b[j++]=s1.top();
                    x=s2.top();s2.pop();
                    y=s2.top();s2.pop();
                    x=js(x,y,b[j-1]);
                    s2.push(x);
                    s1.pop();
                }
                s1.pop();
            }

            else
            {
                while(fun(s1.top())>=fun(a[i]))
                {
                    b[j++]=s1.top();
                    x=s2.top();s2.pop();
                    y=s2.top();s2.pop();
                    x=js(x,y,b[j-1]);
                    s2.push(x);
                    s1.pop();
                }
                s1.push(a[i]);
            }
        }

        while(s1.top()!='#')
        {
            b[j++]=s1.top();
            x=s2.top();s2.pop();
            y=s2.top();s2.pop();
            x=js(x,y,b[j-1]);
            s2.push(x);
            s1.pop();
        }
        b[j]='=';
        b[j+1]='\0';
        puts(b);
        printf("%.2f\n",s2.top());
        s2.pop();
    }
    return 0;
}

 

堆栈的应用:

→函数调用以及递归实现

→深度优先搜索

→回朔算法

→.....

 

 

附上一个堆栈入门程序设计  真是十分的好.简单并且容易理解

转载于:https://www.cnblogs.com/A-FM/p/5104543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值