表达式求值问题(包含两位数)

欢迎加qq群:453398542 学习讨论,会定期分享资料课程,解答问题。
 
表达式求值问题
【问题描述】
    给定一个算术表达式,对该表达式进行四则运算。
(1)以栈作为存储结构,一个栈存放操作符,一个栈存放操作数;
        (2)按字符串形式输入表达式;
        (3)最终结果放在操作数栈中并输出。
给定的表达式中,必须有包含两位数的数值。例如,给定的表达式为:(10+2)*6-12/3
#include<iostream>
using namespace std;
typedef struct SNode{
	int data;
	struct SNode *next;
}SNode,*LinkStack;
char Precede(char theta1,char theta2){
	//比较优先级 
	if(  (theta1=='(' && theta2==')'  ) || (theta1=='#' && theta2=='#') )
		return '=';
	else if( theta1=='(' || theta1=='#' || theta2=='('|| ( theta1=='+'||theta1=='-' )&&(theta2=='*'||theta2=='/') )
		return '<';
	else return '>';
}
int InitStack(LinkStack &S){
	S=NULL;
	return 1;
}
int StackEmpty(LinkStack S){
	if(!S)
		return 1;
	return 0;
}
int Push(LinkStack &S,char e){
	SNode *p=new SNode;
	if(!p){
		return -1;
	}
	p->data=e;
	p->next=S;
	S=p;
	return 1;
}
int Pop(LinkStack &S,char &e){
	SNode *p;
	if(!S)
		return 0;
	e=S->data;
	p=S;
	S=S->next;
	delete p;
	return 1;
}
int GetTop(LinkStack &S,char &e){
	if(!S)
		return 0;
	e=S->data;
	return 1;
}
char Operate(char first,char theta,char second){
	//运算 
	switch(theta){
		case '+':
			return (first-'0')+(second -'0')+48;
		case '-':
			return (first-'0')-(second -'0')+48;
		case '*':
			return (first-'0')*(second -'0')+48;
		case '/':
			return (first-'0')/(second -'0')+48;
	}
}
char EvaluateExpression(){
	//结果 
	LinkStack OPTR,OPND;
	char ch,theta,a,b,x,top,k=0,count;
	InitStack(OPTR);//运算符 
	InitStack(OPND);//数和结果
	Push(OPTR,'#');
	cin>>ch;
	while(ch!='#'||(GetTop(OPTR,top),top!='#')){
		if(isdigit(ch)){
			//判断字符是否为阿拉伯数字 
			if(k>0){
				Pop(OPND,count);
				count=(count-'0')*10+(ch-'0')+48;
				Push(OPND,count);
			}
			else{
				Push(OPND,ch);
			}
			cin>>ch;
			k++;
		}
		else{
			k=0;
			GetTop(OPTR,top);
			switch(Precede(top,ch)){
				case '<':
					Push(OPTR,ch);
					cin>>ch;
					break;
				case '>':
					Pop(OPTR,theta);
					Pop(OPND,a);
					Pop(OPND,b);
					Push(OPND,Operate(b,theta,a));
					break;
				case'=':
					Pop(OPTR,x);
					cin>>ch;
					break;
			}
		}
	}
	GetTop(OPND,ch);
	return ch;
}
int main(){
	cout<<"输入表达式(以#结尾):"<<endl; 
	char res=EvaluateExpression();
	cout<<(int)(res-'0')<<endl;
}

 
 
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个很常见的问题。基本思路是利用两个栈,一个用来存储数字,另一个用来存储运符。具体步骤如下: 1.遍历表达式中的每个字符,如果是数字则直接入数字栈;如果是运符,则与运符栈栈顶元素进行比较,如果当前运符优先级低于栈顶运符,则将栈顶运符弹出,并从数字栈中弹出两个数字进行计,然后将计结果压入数字栈中,直到当前运符优先级高于等于栈顶运符,然后将当前运符入栈。 2.当遍历完表达式后,如果运符栈中还有元素,则从数字栈中弹出两个数字进行计,然后将计结果压入数字栈中,直到运符栈为空。 3.最终,数字栈中的唯一元素就是表达式的求值结果。 下面是一个实现例子(假设表达式中只包含 +、-、*、/ 四种运符): ``` #include <iostream> #include <stack> #include <string> using namespace std; int evaluateExpression(string expr) { stack<int> nums; // 存储数字的栈 stack<char> ops; // 存储运符的栈 int num = 0; // 用来存储多位数字 for (int i = 0; i < expr.length(); i++) { if (isdigit(expr[i])) { // 如果是数字,则存储到 num 中 num = num * 10 + (expr[i] - '0'); } else { // 如果是运符 nums.push(num); // 将之前存储的数字压入数字栈 num = 0; // 重置 num while (!ops.empty() && (ops.top() == '*' || ops.top() == '/') && (expr[i] == '+' || expr[i] == '-')) { // 如果栈顶运符优先级高于等于当前运符,则进行计 int b = nums.top(); nums.pop(); int a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '*') nums.push(a * b); else if (op == '/') nums.push(a / b); } ops.push(expr[i]); // 将当前运符入栈 } } nums.push(num); // 将最后一个数字压入数字栈 while (!ops.empty()) { // 将剩余的运符和数字进行计 int b = nums.top(); nums.pop(); int a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '+') nums.push(a + b); else if (op == '-') nums.push(a - b); else if (op == '*') nums.push(a * b); else if (op == '/') nums.push(a / b); } return nums.top(); // 返回最终结果 } int main() { string expr = "3+5*2-8/4"; cout << evaluateExpression(expr) << endl; // 输出结果为 12 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值