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

算法:

中缀表达式转后缀表达式的方法:
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. c++ 编译期计算 (一)

    编译期就是编译器进行编译,产生.obj文件的所处的那一段时间(如果是广义的编译期,那么一般还包括了链接期,因为现在很多编译器都会自动调用链接器进行链接)执行期就是你执行某个已经链接好的程序的那段时间. ...

  2. Aphache VFS

    http://blog.csdn.net/hemingwang0902/article/details/4733911 http://jackyrong.iteye.com/blog/1330946 ...

  3. worklight 中添加时间控件

    在我们使用worklight开发的过程中,由于文档的不开源和插件的缺少,总是自己琢磨很多东东,更有胜者 需要调用源代码实现某些不易实现的功能.在这里把实现的功能代码贴出来,如有不足之处还望指正! 实现 ...

  4. html中embed标签的用法

    (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,Netscape及新版的IE 都支持.url为音频或视 ...

  5. Python 学习日记(第二周)

    从这周开始我就正式学习Python 语言了.以后每周都会有一篇有关于学习Python的见闻与大家分享! Python的安装 学习的第一步首先要有一个运行的环境.所以接下来介绍一下安装的步骤. 通过Py ...

  6. 基于cygwin构建u-boot(五)结尾:shell 工具

    结尾,基于cygwin对u-boot的处理,很大一部分都是再处理 路径等相关的问题,只有一个涉及到gcc的参数配置. 为了达到顺利编译的目的,使用shell下的部分工具进行处理. 1.sed sed简 ...

  7. sqlserver exists和in 与exists和not in

    1.exists 和 in 1.1 正常情况下exists和in的效果是一样的,如图试验 即使子查询中包含null也没有关系,依然可以正常使用 1.2 in 和 exists效率比较 先看in 由图中 ...

  8. async 异步流程控制规则

    github 学习async网址 : https://github.com/caolan/async/ 1.Async 函数介绍 async 主要实现了三个部分的流程控制功能 1.集合:Collect ...

  9. Dynamics CRM 2013 初体验(2):UI

    Dynamics CRM 2013 系统的UI与2011相比改动是巨大的:传统的导航栏被去掉了,取代它的是win8风格的小磁铁:Ribbon风格的工具栏也被去掉啦,它的风格将回滚至4.0时代:新系统添 ...

  10. vijos1777 引水入城

    描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使居民们都尽可能 ...