顺序栈实现算术表达式的计算

数据结构实验3

#include<iostream>
#include<string>
#include<map>
using namespace std;

template <class T>
class Stack {
public:
	Stack(int size) {
		elements = new T[size];
		MaxSize = size;
		topp =0;
	}
	~Stack()
	{
		delete []elements;
	}
	void OverStack() {
		T* NewArray=NULL;
		int size = MaxSize;
		if (topp >= 0.5 * size) {
			NewArray = new T[2 * size], MaxSize *= 2;
			for (int i = 0; i < topp; ++i)
				NewArray[i] = elements[i];
			delete[]elements;
			elements = NewArray;
		}
	}
	bool IsFull() {
		if (topp == MaxSize + 1)
			return 1;
		return 0;
	}
	bool IsEmpty() {
		if (topp == 0)
			return 1;
		return 0;
	}
	int size() {
		return topp;
	}
	void pop() {
		if(!IsEmpty())
			--topp;
	}
	void push(T a) {
		OverStack();
		++topp;
		elements[topp - 1] = a;
	}
	T top() {
		if(!IsEmpty())
			return elements[topp - 1];
	}
	void clear() {
		topp = 0;
	}

	

private:
	T* elements;
	int topp;
	int MaxSize;
};
//double ChangeNum(Stack<char>st) {//这个stack在函数结束后进行析构的时候有错 不知道为啥
//	double sum=0,i=1;
//	while (!st.IsEmpty()) {
//		sum += (st.top()-'0') * i;
//		st.pop();
//		i *= 10;
//	}
//	return sum;
//}

map<pair<char, char>, bool>ma = { {{'+','+'},1},{{'+','-'},1}, {{'+','*'},0}, {{'+','/'},0}, {{'-','+'},1}, {{'-','-'},1}, {{'-','*'},0}, {{'-','/'},0}, {{'*','+'},1}, {{'*','-'},1}, {{'*','*'},1}, {{'*','/'},1}, {{'/','+'},1}, {{'/','-'},1}, {{'/','*'},1}, {{'/','/'},1} ,{{'+','('},0},{{'-','('},0},{{'*','('},0},{{'/','('},0},{{'(','('},0},{{')','('},0}, {{'+',')'},1}, {{'-',')'},1}, {{'*',')'},1}, {{'/',')'},1}, {{'(',')'},0}, {{')',')'},0},{{'(','+'},0}, {{'(','-'},0}, {{'(','*'},0}, {{'(','/'},0}, {{')','+'},0}, {{')','-'},0}, {{')','*'},0}, {{')','/'},0}, {{'+','\0'},0}, {{'-','\0'},0}, {{'*','\0'},1}, {{'/','\0'},1}, {{'(','\0'},0}, {{')','\0'},0} };
int main() {
	Stack<double>NumSt(10);
	Stack<char>CNumSt(10),CharSt(10);
	string str;
	while (cin >> str) {
		for (int i = 0; i <= str.size(); ++i) {//别忘了字符串记得以‘\0'作为末尾,结束上述的“去括号”,这样才可以使运算符栈里的运算符都是同等级的
			if (str[i] <= '9' && str[i] >= '0')//不支持负数,支持负数的话注意数组是否会越界
				CNumSt.push(str[i]);
			else {
				double sum = 0, j = 1;
				while (!CNumSt.IsEmpty()) {
					sum += (CNumSt.top() - '0') * j;//别忘记减去字符0
					CNumSt.pop();
					j *= 10;
				}
				if(j!=1)//当用到上文的条件判断的时候记得特判,因为sum可以==0,所以用j 作为判断条件
					NumSt.push(sum);
				if (!CharSt.IsEmpty() && ma[{CharSt.top(), str[i]}]) {
					double num2,num1;
					num2 = NumSt.top(); NumSt.pop();
					num1= NumSt.top(); NumSt.pop();
					if (CharSt.top() == '+') {
						num2 = num1 + num2;
						NumSt.push(num2);
					}
					if (CharSt.top() == '-') {
						num2 = num1 - num2;
						NumSt.push(num2);
					}
					if (CharSt.top() == '*') {
						num2 = num1 * num2;
						NumSt.push(num2);
					}
					if (CharSt.top() == '/') {
						num2 = num1*1.0 / num2;
						NumSt.push(num2);
					}
					//cout << num2 << endl;
					CharSt.pop();
				}
				if(i!=str.size())
					CharSt.push(str[i]);

			}
		}

		Stack<char>C2(10);
		Stack<double>N2(10);
		while (!CharSt.IsEmpty())//当进行上述操作结束后,将会使表达式成为同等级的,因此操作符和操作数都应该逆置,顺序计算
			C2.push(CharSt.top()), CharSt.pop();
		while (!NumSt.IsEmpty())
			N2.push(NumSt.top()), NumSt.pop();
		while (!C2.IsEmpty()) {
			if (C2.top() != '(' && C2.top() != ')'){
				double num2, num1;
				num1 = N2.top(); N2.pop();
				num2 = N2.top(); N2.pop();
				if (C2.top() == '+') {
					num2 = num1 + num2;
					N2.push(num2);
				}
				if (C2.top() == '-') {
					num2 = num1 - num2;
					N2.push(num2);
				}
				if (C2.top() == '*') {
					num2 = num1 * num2;
					N2.push(num2);
				}
				if (C2.top() == '/') {
					num2 = num1 * 1.0 / num2;
					N2.push(num2);
				}
				
			}
			C2.pop();
		}
		cout << N2.top()<<endl;
		NumSt.clear(); CNumSt.clear(); CharSt.clear(); C2.clear(); N2.clear();
	}

}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值