C++栈实现混合运算(算式为字符串)

功能:使用堆栈来实现简单加减乘除混合运算。

代码简洁易懂,注释详细,就直接撸代码。一百行,

#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;
	}
}

 

这是在郑大软件工程卓越班的第一天,我喜欢这样的感觉,永远知道自己下一个小时需要干什么,完成任务与否,都不是重要的,重要的是这份充实,这份美好。

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值