首页 > 其他分享 >简单的整数计算器

简单的整数计算器

时间:2023-07-06 23:32:09浏览次数:47  
标签:ch sta int 计算器 整数 char 简单 mystack 表达式


//简单的整数计算器----堆栈的应用

作者:秒大刀

完成日期:2004-10-07

这是一个将中序表达式变成后序表达式,并按照后序表达式进行整数四则运算是的程序

mystak.h        计算器中的一个特殊堆栈,其中push()函数可以保证中序表达式->后序表达式过程中运算优先级别的合理性
mystack.cpp     为以上类的实现文件
main.cpp        为测试驱动文件

void M2B(char from[],char to[])            函数将中序计算成后序
int compvalue(char exp[],long int *n)      计算后序表达式的值
void main()                                为驱动程序


 

//mystak.h
 //计数器中的一个特殊堆栈,其中push()函数可以保证中序表达式->后序表达式过程中运算优先级别的合理性



 #include<stack>
 using namespace std ;

 class mystack{
 public:
 mystack();
 ~mystack();
 public:
 bool empty()const;
 char top()const;
 void pop();
 int push(char ch,char *mubiao);
 private:
 stack<char> sta; 
 };

 

//mystack.cpp
 #include"mystack.h"

 mystack::mystack(){}
 mystack::~mystack(){}
 char mystack::top()const
 {
 return sta.top();
 }
 void mystack::pop()
 {
 sta.pop();
 }
 int mystack::push(char ch,char *mubiao)//关键函数
 {
 int num(0);
 if(ch=='+'||ch=='-')
 {
 while((empty()==false)&&(sta.top()!='('))
 {
 *mubiao=sta.top();sta.pop();mubiao++;
 ++num;
 }
 //todo:
 //sta.push('#');
 sta.push(ch);
 }
 else if(ch=='*'||ch=='/')//此处有BUG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 {
 #ifdef DEBUG
 cout<<"经过了标记"<<__LINE__<<'\t';
 #endif
 while((sta.empty()==false)&&(sta.top()!='-'&&sta.top()!='+'&&sta.top()!='('))
 {
 *mubiao=sta.top();sta.pop();mubiao++;
 ++num;
 }
 //todo:
 //sta.push('#');
 sta.push(ch);
 }
 else if(ch==')')
 {
 #ifdef DEBUG
 cout<<"经过了标记"<<__LINE__<<'\t';
 #endif
 while((sta.empty()==false)&&(sta.top()!='('))
 {
 *mubiao=sta.top();sta.pop();mubiao++;
 ++num;
 }
 //todo:
 //sta.push('#');
 sta.pop();
 }
 else//'('
 {
 //todo:
 sta.push(ch);
 }
 return num;
 }
 bool mystack::empty()const
 {
 if(sta.empty()==false)return false;
 else return true;
 } 
//main.cpp 测试函数
 #define DEBUG
 #include<iostream>
 #include"mystack.h"
 //#include"run.cpp"

 void M2B(char from[],char to[])
 {
 mystack stack;
 char ch;//临时缓冲区
 int f(0),t(0);//分别为数组from和to的下标
 while((ch=from[f++])!='\0')
 {
 #ifdef DEBUG
 cout<<'('<<"ch="<<ch<<")\t";
 #endif
 if(ch>='0'&&ch<='9')
 {
 to[t++]=ch;//
 while((ch=from[f++])!='\0'&&(ch>='0'&&ch<='9')/*||ch=='.'*/)
 {
 to[t++]=ch;
 }
 f--;
 to[t++]='#';
 #ifdef DEBUG
 cout<<"是数字"<<endl;
 #endif
 }
 else
 {
 t+=stack.push(ch,&(to[t]));//?????
 #ifdef DEBUG
 cout<<"是符号"<<endl;
 #endif
 }
 }
 while(stack.empty()==false)
 {
 to[t++]=stack.top();stack.pop();
 }
 to[t]='\0';
 return;
 }
 /
 int compvalue(char exp[],long int *n)//计算后序表达式的值
 {
 stack<int> st;
 long int d,b;
 char ch;
 int t(0);//t作为exp的下标
 while((ch=exp[t++])!='\0')
 {
 if(ch>='0'&&ch<='9')
 {
 d=0;
 do{d=10*d+ch-'0';}
 while((ch=exp[t++])!='#');
 st.push(d);
 }
 else
 {
 d=st.top();st.pop();
 b=st.top();st.pop();
 switch(ch)
 {
 case '+':st.push(b+d);break;
 case '-':st.push(b-d);break;
 case '*':st.push(b*d);break;
 case '/':st.push(b/d);break;
 }
 }
 }
 (*n)=st.top();
 return 1;//成功标志
 }
 void main()
 {
 char str[64];
 char exp[96];
 long int ans;
 while(1)
 {
 cout<<"请输入计算表达"<<endl;
 cin>>str;
 M2B(str,exp);
 cout<<"后序表达式为:"<<exp<<endl;
 compvalue(exp,&ans);
 cout<<"计算结果为: "<<ans<<endl;
 cout<<"___________________________________"<<endl;

 }

 }

标签:ch,sta,int,计算器,整数,char,简单,mystack,表达式
From: https://blog.51cto.com/u_16174476/6647179

相关文章

  • 正则在字符串中的简单应用
    1'''2正则表达式的方法3'''45importre#0.导入正则模块67'''81.使用re.search()方法进行搜索匹配91.预编译正则表达式模式:如果你需要多次使用同一个正则表达式模式,建议使用re.compile()方法预先编译该模式(#预编译正则表达式模式regex=re......
  • Prometheus+alertmanager实现告警的简单验证
    Prometheus+alertmanager实现告警的简单验证背景学习源自:http://www.mydlq.club/article/126/上午没搞定,中午睡不着,继续学习处理.发现最恶心的有点事alertmanager的--cluster.listen-address--web.listen-address两个参数很多资料里面只写了第一个参数,没写第......
  • springcloud - openFeign的简单配置和使用
    openFeign第一步:导入依赖     <dependency>       <groupId>org.springframework.cloud</groupId>       <artifactId>spring-cloud-starter-openfeign</artifactId>     </dependency>第一步:进行配置 server: port:8......
  • springcloud - ribbon简单提点 + 手写轮询算法
    ribbon(依然有人使用,还是很难替换掉)负载均衡+restTemplate实现rpc远程调用新版eureka依赖集成好了ribbon,可以不用重新导入consumer远程调用provider使用到了一个resttemplate类在消费者端的consumer中调用   @Resource   privateRestTemplaterestTemplate;/......
  • 整数二进制奇数,偶数位的打印
    #include<stdio.h>voidPrint(intn){ inti=0; printf("偶数位:"); for(i=30;i>=0;i-=2) { printf("%d",(n>>i)&1); } printf("\n"); printf("奇数位:"); for(i=31;i>......
  • CentOS7搭建简单的邮件服务器_______亲测OK
    邮件服务器概述邮件收、发服务器是分开的,也就是我们需要搭建一个邮件发送服务器和一个邮件收取服务器。本文会搭建收、发两个服务器,并用邮件客户端(Foxmail)做测试。协议协议就是定义规则,这里是邮件协议,定义邮件收发的规则,了解规则有助于理解软件的配置文件。邮件发送协议SMTP(S......
  • springcloud - consul的简单使用和配置
    第一步:导入依赖 <!--   consul-->     <dependency>       <groupId>org.springframework.cloud</groupId>       <artifactId>spring-cloud-starter-consul-discovery</artifactId>     </dependency>第二......
  • 2.5整数和小数和运算
    整数举例:1,2,234,-123,0类型:int浮点型(小数):举例:1.3,2.14,-2.34类型:float可用加+减-乘*除/运算可以用括号改变优先级 ......
  • ubuntu磁盘扩容方法(简单有效)
    准备工作:使用Vmware进行扩展,在进行磁盘扩展的时候,虚拟机不可以有快照使用快照管理删除快照 开始扩容:点击【虚拟机】–【设置】–【硬盘】–【扩展】–填写扩展大小   分区设置:扩展完成后并还需要在操作系统进行设置才能真正使用,下面有几种方法,第一种方法是最简......
  • node restAPI 简单例子
      //第一版,node的httpp//consthttp=require('http');//constserver=http.createServer((req,res)=>{//if(req.url==='/'){//res.write('helloworld')//res.end();//}//if(req.url==='......