#include"seqlist.h"
template<class T, class Container> //適配器模式
class Stack
{
public:
Stack()
:_size(0)
{}
void Push(const T& x)
{
_con.PushBack(x);
_size++;
}
void Pop()
{
_con.PopBack();
_size--;
}
bool Empty() //判空
{
return _size == 0;
}
int size() //計算棧的長度
{
return _size;
}
T& top() //返回棧頂元素
{
return _con.top();
}
private:
Container _con;
size_t _size;
};
enum TYPE
{
OP_NUM,
ADD,
SUB,
MUL,
DIV,
};
struct Exp
{
TYPE _type;
int _data;
};
//中綴表達式 12 *(3 + 4)- 6 + 8 / 2
//後綴表達式 12 3 4 + * 6 - 8 2 / +
Exp RPN_Exp[] = {
OP_NUM, 12,
OP_NUM, 3,
OP_NUM, 4,
ADD ,0,
MUL, 0,
OP_NUM, 6,
SUB, 0,
OP_NUM, 8,
OP_NUM, 2,
DIV, 0,
ADD, 0,
};
Stack<int, SeqList<int>> s1;
int CountRPN_Exp(Exp* RPN_Exp,int size)
{
int left = 0, right = 0;
int res = 0;
for (int i = 0; i < size; i++)
{
switch((RPN_Exp + i)->_type)
{
case ADD:
right = s1.top();
s1.Pop();
left = s1.top();
s1.Pop();
res = left + right;
s1.Push(res);
break;
case SUB:
right = s1.top();
s1.Pop();
left = s1.top();
s1.Pop();
res = left - right;
s1.Push(res);
break;
case MUL:
right = s1.top();
s1.Pop();
left = s1.top();
s1.Pop();
res = left * right;
s1.Push(res);
break;
case DIV:
right = s1.top();
s1.Pop();
left = s1.top();
s1.Pop();
res = left / right;
s1.Push(res);
break;
case OP_NUM:
s1.Push((RPN_Exp + i)->_data);
break;
default:
cout << "無法計算" << endl;
}
}
return s1.top();
}
void test()
{
int ret = CountRPN_Exp(RPN_Exp, sizeof(RPN_Exp) / sizeof(RPN_Exp[0]));
cout <<ret;
}
int main()
{
test();
getchar();
return 0;
}
/*後綴表達式的計算過程:如果遇到操作數,則入棧。如果該項是操作符,則連續從棧中退出兩個操作數
X和Y,形成運算指令X<op>Y,並將計算結果重新壓入棧中,當表達式的所有想都掃描並處理之後,棧頂
存放的就是最後計算結果。*/
後綴表達式的計算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.