首页 > 代码库 > 改进了的栈计算器
改进了的栈计算器
#include<iostream>
#include<stack>
#include<string>
#include<cmath>
#include<iomanip>
using namespace std;
int GetNum(string s){
string ss;
ss = s;
int len = ss.length();
int sum = 0;
int count=0;
for(int i=0;i<len;i++){
if(ss[i]>=‘0‘&& ss[i]<=‘9‘){
sum = (ss[i]-‘0‘)+ sum*10;
count++;
}
else if(count!=0) break;
}
return sum;
}
string CutNum(string s){
string ss,s1;
ss = s;
s1 = "";
int t;
int len = ss.length();
for(int i=0;i<len;i++){
if(ss[i]<‘0‘||ss[i]>‘9‘){
t=i;
break;
}
}
if(t==0) return s1;
for(int j=t;j<len;j++){
s1+=ss[j];
}
return s1;
}
string CutOpra(string s){
string ss,s1;
ss = s;
s1="";
int t=0;
int len = ss.length();
if(len==1) return s1;
for(int i=0;i<len;i++){
if(ss[i]<‘0‘|| ss[i]>‘9‘){
t=i;
break;
}
}
for(int j=t+1;j<len;j++){
s1+=ss[j];
}
return s1;
}
char GetOpra(string s){
string ss,s1;
ss = s;
int t;
int len = ss.length();
for(int i=0;i<len;i++){
if(ss[i]<‘0‘||ss[i]>‘9‘){
t=i;
break;
}
}
char ts;
ts = ss[t];
return ts;
}
//a 栈顶元素
int Level(char a,char b){ // 优先级比较 大于return1 等于return0 小于return-1
if(a==‘+‘&&(b==‘*‘||b==‘/‘||b==‘(‘)) return 1;
else if(a==‘+‘&&(b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘)) return -1;
else if(a==‘-‘&&(b==‘*‘||b==‘/‘||b==‘(‘)) return 1;
else if(a==‘-‘&&(b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘)) return -1;
else if(a==‘*‘&& b==‘(‘) return 1;
else if(a==‘*‘&&(b==‘*‘||b==‘/‘||b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘)) return -1;
else if(a==‘/‘&&(b==‘(‘)) return 1;
else if(a==‘/‘&&(b==‘*‘||b==‘/‘||b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘)) return -1;
else if(a==‘(‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘(‘)) return 1;
else if(a==‘(‘&& b==‘)‘) return 2;
else if(a==‘)‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘)‘||b==‘#‘)) return 1;
else if(a==‘#‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘(‘)) return 1;
else if(a==‘#‘&&b==‘#‘) return 0;
else return 100000;
}
int Judge(string s){
if(s[0]==‘-‘) {
cout<<"由于式子以负号开头,为了方便计算器的运算,所以在整个式子前加一个0"<<endl;
s=‘0‘+s;
}
int len = s.length();
int c=0;
for(int i=0;i<len;i++){
if(s[i]==‘(‘) c++;
if(s[i]==‘)‘) c--;
if(s[i]==‘.‘){
cout<<"本计算器不支持小数点的操作"<<endl;
return 1;
}
if(!((s[i]>=‘0‘&&s[i]<=‘9‘)||s[i]==‘+‘||s[i]==‘-‘||s[i]==‘*‘||s[i]==‘/‘||s[i]==‘#‘||s[i]==‘(‘||s[i]==‘)‘)){
cout<<"对不起,您部分输入字符不符合要求"<<endl;
return 2;
}
if(s[i]==‘0‘&&s[i-1]==‘/‘){
cout<<"被除数为0,操作出现错误"<<endl;
return 0;
}
}
if(c!=0) {
cout<<"您输入的式子括号不匹配"<<endl;
return 3;
}
return -1;
}
void run(){
string s;
getline(cin,s,‘\n‘);
while(Judge(s)==1||Judge(s)==2||Judge(s)==3||Judge(s)==0){
cout<<"请重新输入:";
getline(cin,s,‘\n‘);
}
stack<int> OPND;
stack<char> OPTR;
char op[1000];
int num[1000];
OPTR.push(‘#‘);
int optop=0;
int numtop=0;
int step = 0;
bool fac = false;
cout<<"-------------------------------------------------------------------------------------------------------------------"<<endl;
cout<<"步骤 OPTR栈 OPND栈 输入字符 主要操作 "<<endl;
cout<<"-------------------------------------------------------------------------------------------------------------------"<<endl;
string mainoprt = "";
op[optop++]=‘#‘;
while(s!=""){
int e=0;
int flag=0;
cout<<left<<setw(13)<< ++step;
for(int i=0;i<optop;i++){
cout<<op[i];
}
cout<<left<<setw(15-optop)<<" ";
for(int i=0;i<numtop;i++){
cout<<num[i]<<"‘";
int t = num[i];
if(t<0){
t = -1*t;
flag++;
}
while(t>10){
flag++;
t=t/10;
}
}
cout<<setw(20-2*numtop-flag)<<" ";
cout<<right<<setw(23)<<s<<endl;
if(s[0]<‘0‘||s[0]>‘9‘){
char ts = GetOpra(s);
op[optop++] = ts;
// cout<<"ts="<<ts<<endl;
s=CutOpra(s);
// cout<<"CutOpra(s)=="<<s<<endl;
// cout<<"OPTR.top()="<<OPTR.top()<<endl;
while(Level(OPTR.top(),ts)==-1) {
int a,b;
a = OPND.top();
OPND.pop();
b = OPND.top();
numtop = numtop-2;
// cout<<"a=="<<a<<" "<<"b=="<<b<<endl;
OPND.pop();
if(OPTR.top()==‘*‘) OPND.push(a*b);
if(OPTR.top()==‘/‘) {
if(a==0) cout<<" 程序出现被除数为0的情况,被除数将被随机数取代,此次运算无效"<<endl;
fac = true;
a = 1;
OPND.push(b/a);
}
if(OPTR.top()==‘+‘) OPND.push(a+b);
if(OPTR.top()==‘-‘) OPND.push(b-a);
// cout<<"OPND.top()=="<<OPND.top()<<endl;
optop--;
op[optop-1] = ts;
num[numtop++] = OPND.top();
OPTR.pop();
// cout<<"OPtR.top()=="<<OPTR.top()<<endl;
}
while(Level(OPTR.top(),ts)==1) {
OPTR.push(ts);
break;
}
if(Level(OPTR.top(),ts)==2){
OPTR.pop();
optop = optop-2;
ts = ‘ ‘;
// cout<<"OPtR.top()=="<<OPTR.top()<<endl;
}
if(Level(ts,OPTR.top())==0) {
// cout<<"zhangding="<<OPTR.top()<<endl;
OPTR.pop();
optop = optop-1;
break;
}
}
else{
int a = GetNum(s);
OPND.push(a);
mainoprt +="PUSH(OPND, ‘‘)";
num[numtop++] = a;
s=CutNum(s);
}
}
while(!OPTR.empty()){
// cout<<"zhangding="<<OPTR.top()<<endl;
OPTR.pop();
int a,b;
// a = OPND.top(); cout<<"a="<<a<<endl;
OPND.pop();
//b = OPND.top(); cout<<"b="<<b<<endl;
OPND.pop();
numtop = numtop-2;
if(OPTR.top()==‘*‘) OPND.push(a*b);
if(OPTR.top()==‘/‘) {
if(a==0) cout<<" 程序出现被除数为0的情况,被除数将被随机数取代,此次运算无效"<<endl;
fac = true;
a = 1;
OPND.push(b/a);
}
if(OPTR.top()==‘+‘) OPND.push(a+b);
if(OPTR.top()==‘-‘) OPND.push(b-a);
optop--;
num[numtop++] = OPND.top();
OPTR.pop();
int e=0;
int flag=0;
cout<<left<<setw(13)<< ++step;
for(int i=0;i<optop;i++){
cout<<op[i];
}
cout<<left<<setw(15-optop)<<" ";
for(int i=0;i<=numtop;i++){
cout<<num[i]<<"‘";
int t = num[i];
if(t<0){
t = -1*t;
flag++;
}
while(t>10){
flag++;
t=t/10;
}
}
cout<<setw(26-2*numtop-flag)<<" ";
cout<<right<<setw(23)<<s<<endl;
}
cout<<left<<setw(13)<<step+1<<left<<setw(15-optop)<<"#"<<left<<setw(15-optop)<<OPND.top()<<right<<setw(26)<<"#"<<endl;
cout<<endl;
if(fac == false)cout<<"这个式子的结果="<<OPND.top()<<endl;
else cout<<"这个式子的结果不存在"<<endl;
}
int main(){
while(1){
run();
}
return 0;
}
改进了的栈计算器