使用双栈实现算术表达式求值(C++)

     进入主题前先废话一段,不想看直接跳到第二段吧!两年前我哥给我买了本《算法》(第四版),一直没有看,最近捡起来看看。需要吐槽的是这本《算法》是基于JAVA语言来的,而我又只会C++,纠结了半天还是不打算再学JAVA了,本来C++就不咋地。将就着看吧,正好把JAVA实现算法变成C++实现算法,能更深刻地理解这些算法了。本博客使用C++语言中双栈结构实现算术表达式求值,本人水平有限其中大量情况都没考虑(如开根号,中括号,负数等),只考虑了左右括号、加减乘除这几种情况,实现了算术表达式(1 + ( (2 + 3) * (4 * 5) ) )计算。

     E.W.Dijkstra在20世纪60年代发明了一个非常简单的算法实现初级算术运算操作。该方法需要运用两个栈(操作数栈和运算符栈),方法规则如下:

1、将操作数压入操作数栈;

2、将运算符压入运算符栈;

3、忽略左括号;

4、在遇到右括号时,弹出一个运算发,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈。

     实现代码:

#include <iostream>
#include <stack>
#include <string>

//双栈实现算术表达式求值
int main() 
{
	using namespace std;
	
	stack<char> oper;               // 运算符栈
	stack<double> number;          // 操作数栈

	string mathExpression;
	getline(cin,mathExpression);  //输入算术表达式
	int size = mathExpression.size();
	double result = 0.f;
	for (int i = 0; i < size; i++)
	{
		char ch = mathExpression.at(i);
		if (ch >= '0' && ch <= '9') //判断是否为操作数
		{
			double tem = atoi(&ch);
			number.push(int(tem));
		}
		else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') //判断是否为运算符,这里只定义了加减乘除
		{
			oper.push(ch);
		}
		else if (ch == ')') //判断是否为右括号,进行计算
		{
			double first = number.top(); //获取第一个操作符
			number.pop();
			double second = number.top(); //获取第二个操作符
			number.pop();

			char op = oper.top(); //获取运算符
			oper.pop();
			//进行计算
			if (op == '+')
			{
				result = first + second;
			}
			else if (op == '-')
			{
				result = first - second;
			}
			else if (op == '*')
			{
				result = first * second;
			}
			else if (op == '/')
			{
				result = first / second;
			}
			else
			{
				cout << "undefined operator...." << endl;
			}

			//将运算结果压入操作数栈
			number.push(result);

		}
		else if (ch == '(' || ch == ' ') //忽略左括号和空格
		{
			
		}
		else //未定义字符
		{
			cout << "undefined char..." << endl;
		}
	}
	cout << "The result of the operation is " << result << endl;

	return 0;
}

结果展示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的算数表达式过程的代码示例,仅供参考: ```python # 定义类 class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() else: return None def peek(self): if not self.is_empty(): return self.items[-1] else: return None def size(self): return len(self.items) # 定义操作符优先级 priority = { '+': 1, '-': 1, '*': 2, '/': 2, '(': 0, } # 定义将中缀表达式转换为后缀表达式的函数 def infix_to_postfix(expression): stack = Stack() output = [] for item in expression: if item.isdigit(): output.append(item) elif item == '(': stack.push(item) elif item == ')': while True: op = stack.pop() if op == '(': break output.append(op) else: while not stack.is_empty() and priority[item] <= priority[stack.peek()]: output.append(stack.pop()) stack.push(item) while not stack.is_empty(): output.append(stack.pop()) return output # 定义后缀表达式的函数 def postfix_eval(expression): stack = Stack() for item in expression: if item.isdigit(): stack.push(int(item)) else: b = stack.pop() a = stack.pop() if item == '+': stack.push(a + b) elif item == '-': stack.push(a - b) elif item == '*': stack.push(a * b) elif item == '/': stack.push(a / b) return stack.pop() # 测试样例 expression = '3+5*(7-2)' postfix_expression = infix_to_postfix(expression) result = postfix_eval(postfix_expression) print(result) # 输出 28 ``` 以上代码中,`infix_to_postfix` 函数将中缀表达式转换为后缀表达式,`postfix_eval` 函数后缀表达式。运行测试样例,输出结果为 28。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值