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

题目: 

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


 

输出结果: 

 


主要算法: 

 

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
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值