C++ 栈的应用简单中缀表达式求解

C++ 栈的应用简单中缀表达式求解

直接使用中缀表达式求解的简单代码,使用到了自带的栈的库函数,直接利用中缀表达式求解的过程是这样:首先要将中缀表达式中的操作符和操作数分开,、创建了两个栈来分别存储操作数和操作符,其次扫描表达式,遇到数字则入操作数栈(这里我写的是只有一位的数字,如果多位则要加入其余判断条件获取完整的数字再填入),遇到操作符,做优先级的判断,如果优先级高于操作符栈顶元素,则入栈,反之,则取出两个操作数计算后,压入操作数栈,再次比较。
基本思想如上所述,这里代码注释尽量详细了,如有bug欢迎友好斧正。
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
char fix[50];
//C++库中引入栈的基本操作函数例子 
/*#include<stack>   //引入栈
using namespace std;
int main()
{
	int a;
	stack<int>s;
	cin>>a;
	s.push(a);      //入栈
	cout<<s.top(); //取得栈顶元素输出
	s.pop();        //出栈
	return 0;
} */

//判断字符的优先级 
int judge_level(char s)
{
	switch(s)
	{
		case '+':
			return 1;
			break;
		case '-':
			return 1;
			break;
		case '*':
			return 2;
			break;
		case '/':
			return 2;
			break;
		case '(':
			return 0;
			break;
		case ')':
			return -1;
	 		break;
	}
} 
//中间计算函数方便中间值计算并且将中间值计算后,再次入栈 
int tmp_caculate(char s,int a,int b)
{
	switch(s)
	{
		case '+':
			return a+b;
			break;
		case '-':
			return a-b;
			break;
		case '*':
			return a*b;
			break;
		case '/':
			return a/b;
			break;
	}
}
 //计算
int caculate() 
{
	stack <int> num;//创建操作数栈 
	stack <char> op; //创建操作符栈 
	for(int i = 0;i<strlen(fix);i++)
	{
		if(isdigit(fix[i]))//如果字符串是数字就进入数字栈 
		{
			num.push(fix[i]-48);
		}
		else
		{
			int tmp = judge_level(fix[i]);
			if(op.empty()==true)//如果操作符栈为空直接放入 
			{
				op.push(fix[i]);
			}
			else
			{
				int top_t = judge_level(op.top());//获取操作栈顶信息 
				if(tmp==0)//如果操作符为左括号直接放入 
				{
					op.push(fix[i]);
				}
				else if(tmp>top_t)//如果遇到的操作符优先级高于栈顶元素 
				{
					op.push(fix[i]);
				}
				//如果操作符优先级与栈顶元素相同或者小于,或者是右括号 
				else if(tmp<top_t|tmp==top_t)
				{
					char s_op = op.top();//获取栈顶的操作符 
					op.pop();
					int num_b = num.top();//获取操作符右边的数 
					num.pop();
					int num_a = num.top();//获取操作符左边的数 
					num.pop();
					int res = tmp_caculate(s_op,num_a,num_b);//中间的数 
					num.push(res);
					if(tmp==-1)//是右括号 
					{
						op.pop();//取出左括号 
					}
					else
					{
						i--;//使得这个操作符可以再次比较优先级 
					}	
				}
			}
			
		}
	} 
	//如果上述操作结束后,此时的操作符栈仍有操作符	
	while(op.empty()==false)
	{
		char s_op = op.top();
		op.pop();
		int num_b = num.top();
		num.pop();
		int num_a = num.top();
		num.pop();
		int res = tmp_caculate(s_op,num_a,num_b);
		num.push(res);
	}
	return num.top();//最后在操作数的栈顶 
}
int main()
{
	cout<<"输入中缀表达式:";
	cin>>fix;
	int res = caculate();
	cout<<"结果为:"<<res;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值