#include "mySTL.h"
#include<iostream>
using namespace std;
enum pre{start,num,oper};
char x[255]={0};
void setoper()//设置操作符优先级
{
x['+']=1;
x['-']=1;
x['*']=2;
x['/']=2;
x['(']=3;
}
bool isdigit(char c)//判断是否为数字
{
return(c>='0'&&c<='9');
}
bool isoper(char c)//判断是否为操作符
{
return x[c];
}
void run(myStack<char>&s,myStack<char>&v)//弹出一个操作符和两个操作数进行计算,计算结果压入操作数栈
{
if(s.isEmpty3()) throw"error";
if(v.isEmpty3()) throw"error";
char o=s.getTop();
s.pop();
float x[2];
x[0]=v.getTop();
v.pop();
if(v.isEmpty3()) throw"error";
x[1]=v.getTop();
v.pop();
switch(o)
{
case'+':
v.push(x[1]+x[0]);
break;
case'-':
v.push(x[1]-x[0]);
break;
case'*':
v.push(x[1]*x[0]);
break;
case'/':
v.push(x[1]/x[0]);
break;
default:
throw"error";
}
}
float calc(char *k)//遍历表达式字符串,返回计算结果
{
myStack<char>s;//运算符栈
myStack<char>v;//操作数栈
int i=0,value=0;
char c;
pre status=start;//存储扫描表达式前一个字符时的状态
while(c=k[i])
{
if(isdigit(c))//若为数字,得到新的操作数
{
if(status==num)
{
value=value*10+c-'0';
}
else
{
status=num;
value=c-'0';
}
}
else
{
if(status==num)
v.push(value);
status=oper;
if(c==')')//若为右括号则不断弹出运算符进行计算,直到弹出对应的左括号
{
while(!s.isEmpty3()&&s.getTop()!='(')
{run(s,v);}
if(s.isEmpty3()) throw"error";
s.pop();
}
else if(isoper(c))//若为操作符,入栈或出栈计算
{
if(!s.isEmpty3()&&s.getTop()!='('&&x[c]<=x[s.getTop()])
run(s,v);
s.push(c);
}
}
i++;
}
if(status==num) v.push(value);
while(v.getSize()!=1||s.getSize()!=0) run(s,v);
return v.getTop();
}
int main()
{
setoper();
char s[1024];
while(1)
{
try
{
cin>>s;
cout<<calc(s)<<endl; }
catch(const char *s)
{
cout<<s<<endl;
}
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
mySTL.zip (4个子文件)
应用实例3排序和查找.cpp 1KB
应用实例1四则运算表达式.cpp 2KB
mySTL.h 18KB
应用实例2图的广度遍历.cpp 1KB
共 4 条
- 1
资源评论
pw7777
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功