HDU 1237(简单计算器)栈的应用-表达式求值
来源:互联网 发布:遥感图像拼接软件 编辑:程序博客网 时间:2024/05/16 17:38
直接拿前面栈的表达式改的,把INT改成DOUBLE就行了,忘记删掉输出的那句话了,莫名其妙的错了好多,这就是ACM,输出不像书本,有那么多冗余的句子。
只是为了练习栈的应用,此题还有其它比较简洁的方法。
代码:
#include<stdio.h>#include<string.h>#include<malloc.h>#define InitStackSize 210#define Increase 100typedef struct SqcharStack{char *base,*top;int stacksize;}SqcharStack;typedef struct SqdoubleStack{double *base,*top;int stacksize;}SqdoubleStack;void InitcharStack(SqcharStack &s){s.base=s.top=(char*)malloc(InitStackSize*sizeof(char));s.stacksize=InitStackSize;}void InitdoubleStack(SqdoubleStack &s){s.base=s.top=(double*)malloc(InitStackSize*sizeof(double));s.stacksize=InitStackSize;} void PushcharStack(SqcharStack &s,char key) //字符栈 {if(s.top-s.base>=s.stacksize){s.base=(char*)realloc(s.base,(s.stacksize+Increase)*sizeof(char));s.top=s.base+s.stacksize;s.stacksize+=Increase;}*s.top=key;s.top++;}void PushdoubleStack(SqdoubleStack &s,double key) //数字栈 {if(s.top-s.base>=s.stacksize){s.base=(double*)realloc(s.base,(Increase+s.stacksize)*sizeof(double));s.top=s.base+s.stacksize;s.stacksize+=Increase;}*s.top=key;s.top++;}char GetcharStackTop(SqcharStack S){char e;e=*--S.top;return e;}double GetdoubleStackTop(SqdoubleStack S){double e;e=*--S.top;return e;}int In(char a,char sym[]){int i;for(i=0;i<7;i++)if(sym[i]==a) return 1;return 0;}void PopcharStack(SqcharStack &s){s.top--;}void PopdoubleStack(SqdoubleStack &s){s.top--;}char Precede(char a,char b,char pr[][10]) //判断优先级 {int i,j;switch(a){case '+':i=0;break;case '-':i=1;break;case '*':i=2;break;case '/':i=3;break;case '(':i=4;break;case ')':i=5;break;case '=':i=6;break;default:break;}switch(b){case '+':j=0;break;case '-':j=1;break;case '*':j=2;break;case '/':j=3;break;case '(':j=4;break;case ')':j=5;break;case '=':j=6;break;default:break;}return pr[i][j];}double Operate(double a,double b,char ch){switch(ch){case '+':return b+a;break;case '-':return b-a;break;case '*':return b*a;break;case '/':return b/a;break;default:break;}}int main(){SqcharStack OPTR;SqdoubleStack OPND;char str[211];int i,k,j,byt,temp,len;double num;double a,b; char theta;char pre[][10]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','0'},{'>','>','>','>','0','>','>'},{'<','<','<','<','<','0','='}}; //优先级表 char OP[]={'+','-','*','/','(',')','='}; //操作符集合 memset(str,'\0',sizeof(str));while(gets(str) && strcmp(str,"0")!=0){InitcharStack(OPTR);InitdoubleStack(OPND);PushcharStack(OPTR,'=');len=strlen(str);str[len]='=';len++;i=0;while(i<len){if(str[i]==' '){i++;continue;} if(!In(str[i],OP)) //如果不是操作符,读入数字 {SqcharStack Num;InitcharStack(Num);byt=0; //数字位数 //读入数字字符for(j=i;!In(str[j],OP) && str[j]!=' ' && str[j]!='\0' && str[j]!='=';j++){PushcharStack(Num,str[j]);byt++;}num=0;//生成数字 temp=1;while(byt--){k=(GetcharStackTop(Num)-'0');num+=temp*k;temp*=10;PopcharStack(Num);}PushdoubleStack(OPND,num);//while 生成数字i=j; //i位置跳过数字}//if 是数字 else//操作符 {switch(Precede(GetcharStackTop(OPTR),str[i],pre)){case '<':PushcharStack(OPTR,str[i]);i++;break; //栈顶元素优先权低 case '=':PopcharStack(OPTR);i++;break;//脱括号 case '>':theta=GetcharStackTop(OPTR); //取得栈中运算符 PopcharStack(OPTR);a=GetdoubleStackTop(OPND);PopdoubleStack(OPND);b=GetdoubleStackTop(OPND);PopdoubleStack(OPND);PushdoubleStack(OPND,Operate(a,b,theta)); //这里注意a,b顺序,反了的话减和除运算就错了 break;}} }printf("%.2lf\n",GetdoubleStackTop(OPND));memset(str,'\0',sizeof(str));}return 0;}
0 0
- HDU 1237(简单计算器)栈的应用-表达式求值
- hdu 1237 简单计算器【最简单的表达式求值】
- hdu 1237 简单计算器(表达式求值)
- HDU 1237 简单计算器 表达式求值
- HDU 1237 简单计算器(中缀表达式求值)
- 栈的应用_简单表达式求值
- 简单栈应用-表达式求值
- hdu 1237简单计算器(栈的简单应用)
- HDU 1237 简单计算器(栈的应用)
- [计蒜客 15504 百度的科学计算器(简单)]表达式求值
- 栈的应用 表达式求值
- 表达式求值【栈的应用】
- 栈的应用表达式求值
- 栈的应用-表达式求值
- 栈的应用 表达式求值
- NYOJ 305 表达式求值 (简单栈应用)
- HDU 1237 简单计算器 逆波兰表达式
- 简单的表达式求值
- Protocol Buffer处理嵌套message
- linux驱动之PCI总线
- C++设计模式——观察者模式
- html5+exif.js+canvas实现手机端照片上传预览、压缩、旋转功能
- linux常用命令(50):tftp 命令
- HDU 1237(简单计算器)栈的应用-表达式求值
- Linux下目录的合并以及文件的覆盖案例
- MySQL数据库MyISAM和InnoDB存储引擎的比较
- 【J2EE】企业级项目开发总结--EJB篇
- CnPack开发包基础库
- 【iOS9】我在iOS9遇到的一些问题
- 大家好,,,刚刚来的菜鸟
- unity3d 学习笔记(五) 湖泊与瀑布
- 日志框架Nlog之前言