利用栈来实现算术表达式求值的算法

题目: 

      输入一个简单的算术表达式,并以“#”号结束。利用栈来实现算术表达式求值的算法 


 

输出结果: 

 


主要算法: 

 

char EvaluateExpression()
{//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
	LinkStack OPND, OPTR;
	InitStack(OPND);           //初始化OPND栈
	InitStack(OPTR);           //初始化OPTR栈
	Push(OPTR,'#');            //将表达式起始符"#"压入OPTR栈
	char ch;
	cin >> ch;
	while (ch != '#' || GetTop(OPTR) != '#')    //表达式没有查找完毕或运算符栈的栈顶元素不为"#"
	{
	if (!In(ch)) {    
		Push(OPND, ch);                        //ch不是运算符就进操作数栈 
		cin >> ch;
	}
	else                                       //ch是运算符
		switch (Precede(GetTop(OPTR), ch))     //就比较运算符栈的栈顶元素和ch的优先级
		{
		case'<':                           //运算符栈顶元素优先级小,则将当前字符压入运算符栈
			Push(OPTR, ch);                     
			cin >> ch;                     //读入下一字符ch。
			break;
		case'>':                           //运算符栈顶元素优先级大,                              
			char theta, b, a;
			Pop(OPTR, theta);              //弹出运算符栈顶的运算符,
			Pop(OPND, b);                  //弹出操作数栈顶的两个运算数,
			Pop(OPND, a);
			Push(OPND, Operate(a, theta, b));//将运行结果压入操作数栈。
			break;
		case'=':                       //运算符栈的栈顶元素是"("且ch是")",
			char t;
			Pop(OPTR,t);               //弹出运算符栈顶的"(",
			cin >> ch;                 //读入下一字符。
			break;
		}
	}
	return GetTop(OPND);//操作数栈顶元素即是表达式求值结果
}

完整代码:

#include<iostream>
using namespace std;
typedef struct StackNode
{
	char data;
	struct StackNode *next;
}StackNode,*LinkStack;
int InitStack(LinkStack& S)
{
	S = NULL;
	return 1;
}
int Push(LinkStack& S, char e)
{
	LinkStack p = new StackNode;
	if (!p)
		exit(OVERFLOW);
	p->data = e;
	p->next = S;
	S = p;
	return 1;
} 
char GetTop(LinkStack& S)
{
	if (S == NULL)
		exit(1);
	else
		return S->data;
}
int Pop(LinkStack& S, char& e)
{
	if (S == NULL)
		return 0;
	e = S->data;
	LinkStack p = S;
	S = S->next;
	delete p;
	return 1;
}
int In(char ch) {
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')
		return 1;
	else
		return 0;
}
char Precede(char ch1, char ch2)
{
	char operation{};
	switch (ch1)
	{
	case'+':
	case'-':if (ch2 == '+' || ch2 == '-'||ch2==')'||ch2=='#')
		        operation = '>';
		    else
		        operation = '<';
		    break;
	case'*':
	case'/':if (ch2 == '(' )
		        operation = '<';
		    else
		        operation = '>';
		    break;
	case'(':if (ch2 == ')')
		        operation = '=';
		    else
		        operation = '<';
		    break;
	case')':
	         operation = '>';
		     break;
	case'#': 
		        operation = '<';
		    break;
	}
	return operation;
}
char Operate(char a, char operation, char b)
{
	char result{};
	switch (operation)
	{
	case'+':result= (a-'0') + (b-'0')+'0';
		    break;
	case'-':result = (a - '0') -(b - '0')+'0';
		break;
	case'*':result = (a - '0') * (b - '0')+'0';
		break;
	case'/':result = (a - '0') / (b - '0')+'0';
		break;
	}
	return result;
}

char EvaluateExpression()
{
	LinkStack OPND, OPTR;
	InitStack(OPND);
	InitStack(OPTR);
	Push(OPTR,'#');
	char ch;
	cin >> ch;
	while (ch != '#' || GetTop(OPTR) != '#')
	{
	if (!In(ch)) {
		Push(OPND, ch);
		cin >> ch;
	}
	else 
		switch (Precede(GetTop(OPTR), ch))
		{
		case'<':
			Push(OPTR, ch);
			cin >> ch;
			break;
		case'>':
			char theta, b, a;
			Pop(OPTR, theta);
			Pop(OPND, b);
			Pop(OPND, a);
			Push(OPND, Operate(a, theta, b));
			break;
		case'=':
			char t;
			Pop(OPTR,t);
			cin >> ch;
			break;
		}
	}
	return GetTop(OPND);
}

int main() {
	cout << "请输入一个算数表达式以#结尾:" << endl;
	char r;
	r = EvaluateExpression();
	int s = r - '0';
	cout << "结果为:" <<s;
	return 0;
}

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以回答这个问题。算术表达式求值算法可以通过利用栈来实现。具体步骤如下: 1. 定义两个,一个用来存储操作数,一个用来存储运算符和括号。 2. 从左到右扫描表达式,遇到操作数就直接入操作数,遇到运算符或括号则进行如下操作: a. 如果运算符或括号为空,或者顶元素为左括号,则直接入。 b. 如果遇到右括号,则将运算符中的元素依次弹出,直到遇到左括号为止,并将左括号弹出。 c. 如果遇到运算符,则比较其与顶运算符的优先级,如果优先级高于顶运算符,则直接入,否则将顶运算符弹出,并将操作数中的两个操作数弹出,进行二元运算,并将结果入操作数,直到优先级高于顶运算符或者为空为止,然后将当前运算符入。 3. 当表达式扫描完毕后,如果运算符中还有元素,则依次弹出运算符,并将操作数中的两个操作数弹出,进行二元运算,并将结果入操作数,直到运算符为空为止。 4. 最终操作数中只剩下一个元素,即为表达式的值。 函数 In(c):判断 c 是否为运算符和函数 可以使用以下代码实现: bool In(char c) { if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '^') return true; else return false; } 函数 Precede(t1,t2):判断运算符 t1 和 t2 的优先级 可以使用以下代码实现: int Precede(char t1, char t2) { int p1, p2; switch (t1) { case '+': case '-': p1 = 1; break; case '*': case '/': p1 = 2; break; case '^': p1 = 3; break; case '(': p1 = 4; break; case ')': p1 = 0; break; } switch (t2) { case '+': case '-': p2 = 1; break; case '*': case '/': p2 = 2; break; case '^': p2 = 3; break; case '(': p2 = 0; break; case ')': p2 = 4; break; } if (p1 == p2) return 0; else if (p1 < p2) return -1; else return 1; } 函数 Operate(a,theta,b):对 a 和 b 进行二元运算 theta 可以使用以下代码实现: double Operate(double a, char theta, double b) { switch (theta) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; case '^': return pow(a, b); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值