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

算法:

中缀表达式转后缀表达式的方法:
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. 清空文本框SetDlgItemText(IDC_TXTXT,NULL);

    清空文本框 SetDlgItemText(IDC_TXTXT,NULL);

  2. LNMP环境出现”504 gateway time-out”错误的解决方案

    今天下午在调试测试VPS机器的时候,出现"504 gateway time-out"错误提示.VPS是安装的LNMP一键安装包,关于这个错误之前还没有见过,网上看到比较多的是502 ...

  3. centos mysql 数据存储目录安装位置

    rpm -ql mysql查看安装位置 MYSQL默认的数据文件存储目录为/var/lib/mysql.假如要把目录移到/home/data下需要进行下面几步: 1.home目录下建立data目录 c ...

  4. django的model对象转化成dict

    今天发现一个掉渣天的方法,Django的forms包里面有一个方法:model_to_dict(),它可以将一个model对象转化成dict. In [1]: from apps.dormitory. ...

  5. 《Programming WPF》翻译 第6章 3.二进制资源

    原文:<Programming WPF>翻译 第6章 3.二进制资源 尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满 ...

  6. el简略说明与11个隐含对象

      El的特点:   el语法:     El11个隐含对象:  

  7. 转:helloworld:一个完整的WCF案例

    原文地址:http://blog.csdn.net/mane_yao/article/details/5852845 WCF的ABC: A代表Address-where(对象在哪里)B代表Bindin ...

  8. JS--回到顶部代码

    原文地址:http://www.cnblogs.com/liguiqiang1986/articles/3132023.html JS--回到顶部代码 <!DOCTYPE html PUBLIC ...

  9. Axure 原型设计工具画业务流程图

    加入人人都是产品经理[起点学院]产品经理实战训练营,BAT产品总监手把手带你学产品点此查看详情! 软件行业从业6年,流程图看过太多,大部分流程图是在考验阅读者的理解能力,近期在设计公司新版APP,对流 ...

  10. (DP)House Robber

    题目: You are a professional robber planning to rob houses along a street. Each house has a certain am ...