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

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

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

①运算数:直接输出;

②左括号:压入堆栈;

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

④运算符:

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

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

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

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

下面附上实现代码

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

#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;
}

 

堆栈的应用:

→函数调用以及递归实现

→深度优先搜索

→回朔算法

→.....

 

 

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

posted @ 2016-01-06 10:00  X-POWER  阅读(1130)  评论(0编辑  收藏  举报