实现算术表达式的运算

本文介绍了一个基于顺序栈的算法,用于处理包含整数的操作数和运算符的算术表达式。通过比较运算符优先级,栈内操作数进行计算并更新栈结构。主要涉及栈的创建、操作和优先级判断。
摘要由CSDN通过智能技术生成
//顺序栈实现算术表达式的运算
//运算对象为整数
//建立顺序栈模板类
//主函数中调用教材计算表达式值的程序
// 读取
//计算时使用两个栈,一个存操作数,一个存运算符
//当栈外运算符优先级icp 高于栈顶运算符isp ,或操作数栈内没有两个数,运算符压入栈
//当栈顶运算符优先级icp 高于栈外运算符isp,栈顶运算符出栈,操作数出栈两个进行运算后压回栈顶
//仅支持0-9整数的算术表达式
#include<iostream>
using namespace std;
#include<string>
//建立顺序栈模板类
template <typename T>
class linestack {
public:
	linestack(int maxsize);
	~linestack();
	bool isempty();//判空
	bool isfull();//判满
	T gettop();//返回栈顶值
	int toptop() { return top; }//返回当前栈长
	void push(T& x);//入栈
	T pop();//出栈
private:
	int top;//记录栈顶
	int max;//记录栈大小
	T* data;
};

template<typename T>
linestack<T>::linestack(int maxsize) {
	max = maxsize;
	data = new T[maxsize];
	top = -1;
}
template<typename T>
linestack<T>::~linestack() {
	delete[]data;
}
template<typename T>
bool linestack<T>::isempty() {
	return top == -1;
}
template<typename T>
bool linestack<T>::isfull() {
	return top == max - 1;
}
template<typename T>
T linestack<T>::gettop() {
	return data[top];
}
//入栈
template<typename T>
void linestack<T>::push(T& x) {
	if (isfull()) return;//栈满则无法插入
	else data[++top] = x;
	return;
}
//出栈
template<typename T>
T linestack<T>::pop() {
	if (isempty()) return -1;//栈空无法出栈
	else return data[top--];
}

//判断优先级
int icp(char ch) {
	if (ch == '(') return 6;
	else if (ch == '*' || ch == '/') return 4;
	else if (ch == '+' || ch == '-') return 2;
	else if (ch == ')') return 1;
}
int isp(char ch) {
	if (ch == '(') return 1;
	else if (ch == '*' || ch == '/') return 5;
	else if (ch == '+' || ch == '-') return 3;
	else if (ch == ')') return 6;
}
//取出两个操作数和一个运算符 结果再压入栈
void change(linestack<int>& sum, linestack<char>& cha) {
	char ch = cha.pop();
	if (ch == '(') return;
	int a = sum.pop();
	int b = sum.pop();
	int c;
	if (ch == '+')  c = b + a;
	else if (ch == '-')  c = b - a;
	else if (ch == '*')  c = b * a;
	else if (ch == '/')  c = b / a;
	sum.push(c);
	return;
}

//主功能实现计算算术表达式
int main() {
	string str;
	while (cin >> str) {
		linestack<int> num(20);
		linestack<char> chr(20);
		//一个栈存数 一个栈存运算符
		for (int i = 0; i < str.size(); ++i){//string以\0结尾
			if (str[i] <= '9' && str[i] >= '0') {//碰到数
				int numb = str[i] - 48;
				num.push(numb);
			}else {    //碰到操作符
				if (!chr.isempty()) {//非空//不空时作判断
					if (isp(chr.gettop()) >= icp(str[i]) ) {//退栈
						change(num, chr);	
					}
				}
				if (str[i] != ')') chr.push(str[i]);//压入栈
			}
		}
		while (num.toptop() > 0) change(num, chr);
		cout << num.gettop() << endl;
	}
	return 0;
}

只实现到个位数整数的运算

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值