HDU-简单计算器-1237
这道题我做了一天,把中缀表达式转化为后缀表达式,但遇到了储存的问题,考虑了好久,写出后又调试,弄了一天,下面说一下中缀表达式转换后缀表达式:
算法:
中缀表达式转后缀表达式的方法:
 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的更多相关文章
- hdu 1237 简单计算器
		题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ... 
- hdu 1237 简单计算器(栈处理)
		简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ... 
- hdoj 1237 简单计算器
		简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ... 
- HDOJ 1237题  简单计算器
		简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ... 
- 1.C#WinForm基础制作简单计算器
		利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ... 
- 菜鸟学Android编程——简单计算器《一》
		菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ... 
- PAT 06-1 简单计算器
		想看一般简单计算器实现的看客不好意思了,这不是你想要点东西,此处题设为“只能进行加减乘除”.“都是整数”.”优先级相同“和"从左到右".此题来自PAT(http://www.pat ... 
- php大力力 [005节] php大力力简单计算器001
		2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ... 
- PHP实现简单计算器
		<!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ... 
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
		网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ... 
随机推荐
- Angularjs 日期格式转换
			我自己的随笔,记录我编码的点滴. <!DOCTYPE HTML><html><head> <meta charset="utf-8" ... 
- jquery 1.9 之后toggle不能用的问题
			今天用到toggle这个方法,发现不是自己想要的效果,之前有用过好多次,一直都没有问题. 网上查了原因,才知道是版本的问题,jquery1.9之后toggle取消了.那么如果想要继续用toggle的这 ... 
- irms模拟数据生成及数据分析
			一.数据准备 1.每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条 随机数据生成: 2,32 * * * * bash /mnt/jediael/irms/signalGenerat ... 
- 单片微机原理P3:80C51外部拓展系统
			外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC. 0. IO接口电路概念与存储器拓展 1. 为什 ... 
- HTML中select标签单选多选详解
			select 元素可创建单选或多选菜单.当提交表单时,浏览器会提交选定的项目,或者收集用逗号分隔的多个选项,将其合成一个单独的参数列表,并且在将 <select> 表单数据提交给服务器时包 ... 
- 为什么说 Git 比 SVN 更好
			为什么说 Git 比 SVN 更好 在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题.使用Git极大地提高了开发效率.扩大了开源项目的参与度. 增强了版本控制系统的安全性, ... 
- Powershell环境变量
			Powershell环境变量 9 12月, 2011 在 Powershell tagged 变量by Mooser Lee 本文索引 [隐藏] 1读取特殊的环境变量 2查找环境变量 3创建新的环境 ... 
- 五子棋AI
			下面是一些参考资料,打算看看: http://www.cnblogs.com/Blog_SivenZhang/archive/2010/06/13/1757677.html http://blog.c ... 
- 转:PO BO VO DTO POJO DAO概念及其作用
			J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ... 
- HDU4532(组合DP)
			题目:安排座位 解析:http://www.douban.com/note/269136472/ #include <iostream> #include <string.h> ... 
