【数据结构】栈的应用——中缀表达式求值(c++)

本文介绍如何使用C++通过栈来解决中缀表达式的求值问题,探讨数据结构中栈的基本操作在计算数学表达式中的应用。
摘要由CSDN通过智能技术生成

头文件:


#pragma once

#include <iostream>
#include <assert.h>
#include <string>
using namespace std;

template<class Type>
class SeqStack
{
public:
	SeqStack(size_t sz = INIT_SZ);
	~SeqStack();
public:
	bool empty()const;
	bool full()const;
	void show()const;
	bool push(const Type &x);
	bool pop();
	void gettop(Type &x);
	int length()const;
	void clear();
	void destory();
	void quit_system(Type &x);
private:
	enum{ INIT_SZ = 64 };
	Type *base;
	int capacity;
	int top;
};

template<class Type>
SeqStack<Type>::SeqStack(size_t sz = INIT_SZ)
{
	capacity = sz > INIT_SZ ? sz : INIT_SZ;
	base = new Type[capacity];
	assert(base != NULL);
	top = 0;
}

template<class Type>
SeqStack<Type>::~SeqStack()
{
	destory();
}

// 判断栈是否满了
template<class Type>
bool SeqStack<Type>::full()const
{
	return (top >= capacity);
}

// 判断是否
是一种先进后出(LIFO,Last In First Out)的数据结构,在中缀表达式求值中非常有用。当我们需要将中缀表达式转换为等价的后缀(也称为逆波兰表示法,RPN),然后使用来进行计算时,可以利用的特性。 以下是一个简单的 C++ 代码实现,用于中缀表达式的求值: ```cpp #include <iostream> #include <stack> #include <string> using namespace std; int isOperator(char op) { if (op == '+' || op == '-' || op == '*' || op == '/') return true; return false; } int priority(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return -1; } double applyOp(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; // 注意这里除数不能为0 default: return 0; // 非法操作符 } } double evaluatePostfix(string tokens) { stack<double> values; stack<char> ops; for (char token : tokens) { if (!isOperator(token)) { values.push(stod(token)); } else { while (!ops.empty() && priority(ops.top()) >= priority(token)) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } ops.push(token); } } while (!ops.empty()) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } return values.top(); } int main() { string expression = "3 + 5 * 2"; // 示例中缀表达式 cout << "Value of expression: " << evaluatePostfix(expression) << endl; return 0; } ``` 在这个代码中,我们遍历中缀表达式的每个字符,如果是数字就入,如果是运算符则取出顶两个数做相应运算并压回结果,直到运算符为空。最后顶剩下的就是表达式的计算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值