计算器 栈 带括号 2016 10 21
Posted 任我主宰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算器 栈 带括号 2016 10 21相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<stack>
#include<string>
#include<cmath>
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;
}
void run(){
string s;
getline(cin,s,‘\n‘);
stack<int> OPND;
stack<char> OPTR;
OPTR.push(‘#‘);
while(s!=""){
cout<<s<<endl;
cout<<s[0]<<endl;
if(s[0]<‘0‘||s[0]>‘9‘){
char ts = GetOpra(s);
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();
cout<<"a=="<<a<<" "<<"b=="<<b<<endl;
OPND.pop();
if(OPTR.top()==‘*‘) OPND.push(a*b);
if(OPTR.top()==‘/‘) OPND.push(b/a);
if(OPTR.top()==‘+‘) OPND.push(a+b);
if(OPTR.top()==‘-‘) OPND.push(b-a);
cout<<"OPND.top()=="<<OPND.top()<<endl;
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();
ts = ‘ ‘;
cout<<"OPtR.top()=="<<OPTR.top()<<endl;
}
if(Level(ts,OPTR.top())==0) {
cout<<"zhangding="<<OPTR.top()<<endl;
OPTR.pop();
break;
}
}
else{
int a = GetNum(s);
OPND.push(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();
if(OPTR.top()==‘*‘) OPND.push(a*b);
if(OPTR.top()==‘/‘) OPND.push(b/a);
if(OPTR.top()==‘+‘) OPND.push(a+b);
if(OPTR.top()==‘-‘) OPND.push(b-a);
OPTR.pop();
}
cout<<"OPND.top()="<<OPND.top()<<endl;
}
int main(){
run();
return 0;
}
以上是关于计算器 栈 带括号 2016 10 21的主要内容,如果未能解决你的问题,请参考以下文章