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

算法:

中缀表达式转后缀表达式的方法:
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. eclipse修改字体

    修改xml字体: window→Preferences→General→Colors and Fonts→Basic→Text Font

  2. LeetCode_Palindrome Partitioning

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  3. JavaScrip常规函数

    JavaScrip常规函数包括以下8个:alert函数:显示一个警告对话框,包括一个"OK"按钮.confirm函数:显示一个确认对话框,包括一个"OK".&q ...

  4. java设计模式--结构型模式--代理模式

    代理模式 概述 为其他对象提供一种代理以控制对这个对象的访问. 适用性 1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表. 2.虚代理(VirtualProxy)根据需要创 ...

  5. C++的构造函数总结

    构造函数是C++的一个很基础的知识点,在平时编程的时候,相信大家都很熟悉,虽然比较基础,但是细究下来,还是有不少细节需要注意.这篇文章主要总结C++构造函数需要注意一些细节,一方面,可以帮助下大家巩固 ...

  6. Reverse Linked List II 解答

    Question Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Giv ...

  7. c语言所有的errno枚举值含义

    可以通过以下代码,获取所有的错误码信息: #include <string.h> /* for strerror */ #include <errno.h> #include ...

  8. android滑动基础篇 TouchView

    效果图: 代码部分: activity类代码: package com.TouchView; import android.app.Activity; import android.os.Bundle ...

  9. PyQt4中无边框窗口的移动(拖动)

    import sys from PyQt4.QtGui import * from PyQt4.Qt import * from PyQt4.QtCore import * class AboutUs ...

  10. 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON() —(转)

    一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...