这道题我做了一天,把中缀表达式转化为后缀表达式,但遇到了储存的问题,考虑了好久,写出后又调试,弄了一天,下面说一下中缀表达式转换后缀表达式:

算法:

中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
例如
a+b*c+(d*e+f)*g ----> abc*+de*f+g*+

遇到a:直接输出:
后缀表达式:a
堆栈:空

遇到+:堆栈:空,所以+入栈
后缀表达式:a
堆栈:+
遇到b: 直接输出
后缀表达式:ab
堆栈:+
遇到*:堆栈非空,但是+的优先级不高于*,所以*入栈
后缀表达式: ab
堆栈:*+
遇到c:直接输出
后缀表达式:abc
堆栈:*+
遇到+:堆栈非空,堆栈中的*优先级大于+,输出并出栈,堆栈中的+优先级等于+,输出并出栈,然后再将该运算符(+)入栈
后缀表达式:abc*+
堆栈:+
遇到(:直接入栈
后缀表达式:abc*+
堆栈:(+
遇到d:输出
后缀表达式:abc*+d
堆栈:(+
遇到*:堆栈非空,堆栈中的(优先级小于*,所以不出栈
后缀表达式:abc*+d
堆栈:*(+
遇到e:输出
后缀表达式:abc*+de
堆栈:*(+
遇到+:由于*的优先级大于+,输出并出栈,但是(的优先级低于+,所以将*出栈,+入栈
后缀表达式:abc*+de*
堆栈:+(+
遇到f:输出
后缀表达式:abc*+de*f
堆栈:+(+
遇到):执行出栈并输出元素,直到弹出左括号,所括号不输出
后缀表达式:abc*+de*f+
堆栈:+
遇到*:堆栈为空,入栈
后缀表达式: abc*+de*f+
堆栈:*+
遇到g:输出
后缀表达式:abc*+de*f+g
堆栈:*+
遇到中缀表达式结束:弹出所有的运算符并输出
后缀表达式:abc*+de*f+g*+
堆栈:空

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

union{
    double n;
    char m;
}a[1000];

int main()
{
    double aq[1000];
    int top1,top2,top3,len,i,d;
    char b[1000],gst[1000];
    while(gets(gst)>0)
    {
        memset(a,0,sizeof(a));
        memset(aq,0,sizeof(aq));
         len=strlen(gst);
        if(gst[0]=='0'&&len==1)
            break;
        top1=top2=top3=-1;
        d=0;
      
        for(i=0; i<len; i++)
        {
            if(gst[i]!=' ')
            {
                if(gst[i]>='0'&&gst[i]<='9')
                {
                    if(d==0)
                        top1++;
                    a[top1].n=a[top1].n*10+gst[i]-48;
                }
                d=1;
                switch(gst[i])
                {
                case'+':
                    while(b[top2]=='*'||b[top2]=='/'||b[top2]=='+'||b[top2]=='-')
                    {
                        if(b[top2]=='*')
                        {
                            top1++;
                            a[top1].m='*';
                            top2--;
                        }
                        if(b[top2]=='/')
                        {
                            top1++;
                            a[top1].m='/';
                            top2--;
                        }
                        if(b[top2]=='+')
                        {
                            top1++;
                            a[top1].m='+';
                            top2--;
                        }
                        if(b[top2]=='-')
                        {
                            top1++;
                            a[top1].m='-';
                            top2--;
                        }
                    }
                    if(top2==-1)
                    {
                        top2++;
                        b[top2]='+';
                    }
                    break;
                case'-':
                    while(b[top2]=='*'||b[top2]=='/'||b[top2]=='+'||b[top2]=='-')
                    {
                        if(b[top2]=='*')
                        {
                            top1++;
                            a[top1].m='*';
                            top2--;
                        }
                        if(b[top2]=='/')
                        {
                            top1++;
                            a[top1].m='/';
                            top2--;
                        }
                        if(b[top2]=='+')
                        {
                            top1++;
                            a[top1].m='+';
                            top2--;
                        }
                        if(b[top2]=='-')
                        {
                            top1++;
                            a[top1].m='-';
                            top2--;
                        }
                    }
                    if(top2==-1)
                    {
                        top2++;
                        b[top2]='-';
                    }
                    break;
                case'*':
                    while(b[top2]=='*'||b[top2]=='/')
                    {
                        if(b[top2]=='*')
                        {
                            top1++;
                            a[top1].m='*';
                            top2--;
                        }
                        if(b[top2]=='/')
                        {
                            top1++;
                            a[top1].m='/';
                            top2--;
                        }
                    }
                    top2++;
                    b[top2]='*';
                    break;
                case'/':
                    while(b[top2]=='*'||b[top2]=='/')
                    {
                        if(b[top2]=='*')
                        {
                            top1++;
                            a[top1].m='*';
                            top2--;
                        }
                        if(b[top2]=='/')
                        {
                            top1++;
                            a[top1].m='/';
                            top2--;
                        }
                    }
                    top2++;
                    b[top2]='/';
                    break;
                }
            }
            else
            {
                d=0;
            }
        }
       
        for(;top2>=0;top2--)
        {
            switch(b[top2])
            {
            case'+':
                top1++;
                a[top1].m=b[top2];
                break;
            case'-':
                top1++;
                a[top1].m=b[top2];
                break;
            case'*':
                top1++;
                a[top1].m=b[top2];
                break;
            case'/':
                top1++;
                a[top1].m=b[top2];
                break;
            }
        }
        for(i=0;i<((len+1)/2);i++)
        {
            if(a[i].m!='+'&&a[i].m!='-'&&a[i].m!='*'&&a[i].m!='/')
            {
                top3++;
                aq[top3]=a[i].n;
            }
            else
            {
                switch(a[i].m)
                {
                case'+':
                    aq[top3-1]+=aq[top3];
                    top3--;
                    break;
                case'-':
                    aq[top3-1]-=aq[top3];
                    top3--;
                    break;
                case'*':
                    aq[top3-1]*=aq[top3];
                    top3--;
                    break;
                case'/':
                    aq[top3-1]/=aq[top3];
                    top3--;
                    break;
                }
            }
        }
        printf("%.2lf\n",aq[0]);
    }
    return 0;
}

这题是练习栈的很好的题,一队友子的代码,没用栈的知识,很好理解:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000];
    int i,len,j,k,t,e;
    double b[10000],flag[10000],sum;
    while(gets(a))
    {
        len=strlen(a);k=0;
        for (i=0;i<len;i++)
        if(a[i]=='0')
        k++;
        if(k==len)
        break;
        memset(b,0,sizeof(b));
        memset(flag,0,sizeof(flag));
        k=0;
        for (i=0,j=0;i<=len;i++)
        {
            if(a[i]>='0'&&a[i]<='9')
            k++;
            else if(a[i]==' '||i==len)
            {
                int s=1.0;
                for (t=0,e=i-1;t<k;t++,e--)
                {
                    if(t!=0)
                b[j]=(double)(a[e]-'0')*s+b[j];
                else
                b[j]=(double)(a[e]-'0')*1.0;
                s*=10;
                }

if(k)
                j++;
                k=0;
            }
            else if(a[i]=='+')
            flag[j++]=1;
            else if(a[i]=='-')
            flag[j++]=2;
            else if(a[i]=='*')
            flag[j++]=3;
            else if(a[i]=='/')
            flag[j++]=4;
        }

for (i=0;i<j;i++)
        {
            if(flag[i]==3)
                {
                    b[i+1]=b[i+1]*b[i-1];
                    b[i-1]=0;
                    if (flag[i-2]==2)
                     flag[i]=2;
                     else flag[i]=1;
                }
            else if(flag[i]==4)
                {
                    b[i+1]=b[i-1]/b[i+1];
                     b[i-1]=0;
                     if (flag[i-2]==2)
                     flag[i]=2;
                     else flag[i]=1;
                }
        }

for(i=1;i<j;i++)
        {
            if(flag[i]==2)
            {b[i+1]=-b[i+1];}
        }
        sum=0;
        for (i=0;i<j;i++)
        sum+=b[i];
        printf ("%.2lf\n",sum);
    }
    return 0;
}

HDU-简单计算器-1237的更多相关文章

  1. hdu 1237 简单计算器

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...

  2. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. hdoj 1237 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. HDOJ 1237题 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  5. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  6. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  7. PAT 06-1 简单计算器

    想看一般简单计算器实现的看客不好意思了,这不是你想要点东西,此处题设为“只能进行加减乘除”.“都是整数”.”优先级相同“和"从左到右".此题来自PAT(http://www.pat ...

  8. php大力力 [005节] php大力力简单计算器001

    2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...

  9. PHP实现简单计算器

    <!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ...

  10. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

随机推荐

  1. Android开发笔记之: 数据存储方式详解

    无论是神马平台,神马开发环境,神马软件程序,数据都是核心.对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用.总体的来讲,数据存储方式有三种:一个是文件,一个是数 ...

  2. Web项目中用模板Jsp页面引入所有静态样式脚本文件(js,css等)

    这样的好处是不需要再每个页面中都添加太多的外链接(不会减少请求数量),但对开发会更快捷,如果更改这些文件的位置或名称,只需要更改模板文件,不需要一个一个页面复制粘贴:同时可以为不同jsp页面组创建不同 ...

  3. Android平台之不预览获取照相机预览数据帧及精确时间截

    在android平台上要获取预览数据帧是一件极其容易的事儿,但要获取每帧数据对应的时间截并不那么容易,网络上关于这方面的资料也比较少.之所以要获取时间截,是因为某些情况下需要加入精确时间轴才能解决问题 ...

  4. Nasty Hacks <入门练手题>

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. Scala学习文档-各种使用模式的情况

    模式在变量定义中 在定义val或者var的时候,可以使用模式替代简单的标识符,如可以使用模式拆分元组,并把每个值分配给变量 val myTuple = (123,"abc") va ...

  6. 谁在唱衰PC?说出你的理由

    在平板电脑的冲击下,PC真的衰落了吗?戴尔消费产品市场副总裁Raymond Wah给出了坚定的回答:“平板电脑没有办法代替PC”. 让他有如此底气做出这一判断的取决于两方面:一方面,PC(了解PC市场 ...

  7. Windows搭建SMTP邮件服务器

    From:http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e4cf06f5-9a36-474b-b ...

  8. jsp中全局变量和局部变量的设置

  9. 修改Fedora 20 启动项

    在Fedora 20里面,Fedora 使用了systemd作为系统与服务的管理工具,这个守护进程是系统开机后第一个开启的进程,pid 为1.systemd扮演着初始化系统的角色,主要用于开启与维护系 ...

  10. poj2739

                                                                                           Sum of Consec ...