C++ 新手 使用堆栈原理写的简易计算器程序
来源:互联网 发布:tmp mysql.sock 编辑:程序博客网 时间:2024/06/14 07:23
自己感觉写的很挫,还可能有bug,欢迎大家批评指正
基本原理就是截取字符串的各部分结合堆栈。
#include <iostream>
#include<string>
#include<stack>
#include <cstdlib>
using namespace std;
int rule[7][7];//计算法则 通过当前读取的操作符与栈顶的比较的依据。
stack<double> output;//存放操作数
stack<char> operators;//存放operator
void GetResult(double& result)//取出操作数并计算
{
double temp1,temp2;
temp1=output.top();
output.pop();
temp2=output.top();
output.pop();
switch (operators.top())
{
case '+':
result=temp2+temp1;
break;
case '-':
result=temp2-temp1;
break;
case '*':
result=temp2*temp1;
break;
case '/':
result=temp2/temp1;
break;
}
output.push(result);
operators.pop();
}
bool IsNum(char str1)
{
if ((str1>='0'&&str1<='9')||str1=='.')
return true;
return false;
}
//0:> 1:< 2: = 3:inlegal
void init()
{
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(i==0||i==1)
{
if(j==0||j==1||j==5||j==6)
{
rule[i][j]=0;
}
else
{
rule[i][j]=1;
}
}
else if(i==2||i==3)
{
if(j==4)
{
rule[i][j]=1;
}
else
rule[i][j]=0;
}
else if(i==4||i==6)
{
if(j==5)
{
rule[4][5]=2;
rule[6][5]=3;
}
else if(j==6)
{
rule[4][6]=3;
rule[6][6]=2;
}
else
rule[i][j]=1;
}
else
{
if(j==4)
{
rule[i][j]=3;
}
else
{
rule[i][j]=0;
}
}
}
}
}
int Equal(char m ,char n)//对应关系
{
int x,y;
switch(m)
{
case '+':
x=0;
break;
case '-':
x=1;
break;
case '*':
x=2;
break;
case '/':
x=3;
break;
case '(':
x=4;
break;
case ')':
x=5;
break;
case '#':
x=6;
break;
default:
cout<<"BadInput"<<endl;
exit(1);
}
switch(n)
{
case '+':
y=0;
break;
case '-':
y=1;
break;
case '*':
y=2;
break;
case '/':
y=3;
break;
case '(':
y=4;
break;
case ')':
y=5;
break;
case '#':
y=6;
break;
default:
cout<<"BadInput"<<endl;
exit(1);
}
return rule[x][y];
}
int main()
{
cout<<"----------------------------欢迎来到简易计算器------------------------------------"<<endl;
cout<<"-------------------------------------------------(there may be some bugs)------"<<endl;
char play='y';
while(play=='y')
{
init();
string str;
cout<<"Enter the expression you want to calculate"<<endl;
cin>>str;
str+="#";
operators.push('#');
string temp,qian="";//+ -
for(int i=0;i<str.size();i++)
{
//----------------此处往下为获取字符串的各部分,支持正负数,小数,括号等 比较繁琐。。。。----------------
bool mark=false;
temp=str[i];
if(IsNum(str[i]))
{
mark=true;
if(++i<str.size())
{
while(IsNum(str[i]))
{
temp+=str[i];
i++;
}
}
temp.insert(0,qian);
qian="";
i--;
}
else
{
if(temp[0]!=')'&&i+2<str.size()&&IsNum(str[i+2]))
{
if(str[i+1]=='+'||str[i+1]=='-')
{
qian=str[i+1];
i++;
}
else
{
if(IsNum(str[i+1]))
{
}
else if(str[i+1]=='('){
}
else
{
cout<<"Badinput"<<endl;
exit(1);
}
}
}
}
//----------------------------------------------------------------------------------------------------------------------
if(mark)//push numbers into stack
{
double num=atof(temp.c_str());
output.push(num);
mark=false;
}
else//cal the result according to the rule
{
int x=Equal(operators.top(),temp[0]);
double result;
switch(x)
{
case 0:
if(temp[0]!=')')
{
GetResult(result);
if(qian!="")
{
i-=2;//position is very import
}
else
i--;
}
else
{
while(operators.top()!='(')
{
GetResult(result);
}
operators.pop();
}
break;
case 1:
operators.push(temp[0]);
break;
case 2:
operators.pop();
break;
case 3:
cout<<"BadInput"<<endl;
exit(1);
}
}
}
cout<<output.top()<<endl;
cout<<"something else?(y for yes,n for no)"<<endl;
cin>>play;
}
return 0;
}
- C++ 新手 使用堆栈原理写的简易计算器程序
- JS写简易计算器的原理
- 用C写的简易计算器
- C语言写的简易计算器
- C语言写的一个简易计算器
- C语言新手写的计算器
- C的简易计算器
- 一个简易的计算器程序
- 用JS写的一个简易计算器
- 用Android写的一个简易计算器
- 用JAVA写的简易计算器
- java简易计算器窗口的实现,写的第二个java程序!多多指教
- Swift写简易计算器
- Javascript写简易计算器
- 学c语言第一个自己写的计算器程序
- Android小程序-简易计算器的实现
- Java写的计算器程序
- 用C语言堆栈操作的计算器的实现(输入输出流使用的C++)
- 无线路由的一些高级参数配置
- python通过swig调用c++dll时指针的用法
- mac上如何卸载oracle jdk 1.8
- 用VC实现特定编辑框上对回车键响应
- java interface 中保存数据
- C++ 新手 使用堆栈原理写的简易计算器程序
- struts2的ognl标签详解
- 基于Flume的美团日志收集系统(二)改进和优化
- 详解C中volatile关键字
- Cocos2d-x(或者应用)第三方类库不支持arm64的有关问题解决(64位架构)
- Trie树(字典树)
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR...
- Run Book Automation - RBA开发系列一
- 使用IPMI控制/监控Linux服务器