功能:使用堆栈来实现简单加减乘除混合运算。
代码简洁易懂,注释详细,就直接撸代码。一百行,
#include<cstdio>
#include<iostream>
#include<stack>
#include<cstdlib>
using namespace std;
int tool(char s[]);
bool tool1(char a,char b);
int value(char s[]);
int main()
{
char s[100];
scanf("%s",s);
printf("%d",value(s));
}
int value(char s[])
{
if(s==NULL){
return 0;
}
stack <int> num;
stack <char> tag;
int a1,a2,a3,a,i=0;
bool flag;
char s1[20],c1,c2,c3;
while(s[i]!='\0'){
//运用递归消去括号
if(s[i]=='('){
i++;
int j=0;
while(s[i]!=')') s1[j++]=s[i++];//字符串复制
i++;
s1[j]='\0';
num.push(value(s1));
continue;
}
//得数字
if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/'){
int j=0;
while(s[i]!='\0'){
s1[j++]=s[i++];
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='\0'){
s1[j]='\0';
break;
}
}
num.push(tool(s1));
}
//得到符号并且计算
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
tag.push(s[i]);
i++;
}//得到一个循环
}//退出扫描循环
//开始计算 *************************8
while(!num.empty()){
if(num.size()==1){
return num.top();
}//如果开始只有一个值返回
if(tag.size()==1){
a1 = num.top();num.pop();
a2 = num.top();num.pop();
c1 = tag.top();tag.pop();
switch(c1){
case '+' :a = a2+a1;puts("加");break;
case '-' :a = a2-a1;puts("减");break;
case '*' :a = a2*a1;puts("乘");break;
case '/' :a = a2/a1;puts("除");break;
}
return a;
}//最后一步:返回一个结果
//至少有三项num
a1 = num.top();num.pop();
a2 = num.top();num.pop();
c1 = tag.top();tag.pop();
c2 = tag.top();tag.pop();
flag = tool1(c1,c2);
if(flag){//允许先行运算
switch(c1){
case '+' :a = a2+a1;puts("加");break;
case '-' :a = a2-a1;puts("减");break;
case '*' :a = a2*a1;puts("乘");break;
case '/' :a = a2/a1;puts("除");break;
}
num.push(a);
tag.push(c2);
}else{
c3 = tag.top();tag.pop();
a3 = tag.top();tag.pop();
switch(c2){
case '+' :a = a3+a2;puts("加");break;
case '-' :a = a3-a2;puts("减");break;
case '*' :a = a3*a2;puts("乘");break;
case '/' :a = a3/a2;puts("除");break;
}
num.push(a);num.push(a1);
tag.push(c3);tag.push(c1);
}
}
puts("程序异常");
exit(0);
return 0;
}
int tool(char s[]){//实现字符串化为数字
int a=0;
for(int i=0;s[i]!='\0';i++)
{
a=a*10+(s[i]-'0');
}
return a;
}
bool tool1(char a,char b){//实现判断运算符优先级
if(a=='+'&&b=='*'||a=='+'&&b=='/'||a=='-'&&b=='*'||a=='-'&&b=='/'){
return false;
}else{
return true;
}
}
这是在郑大软件工程卓越班的第一天,我喜欢这样的感觉,永远知道自己下一个小时需要干什么,完成任务与否,都不是重要的,重要的是这份充实,这份美好。