在栈的应用中有一个最经典的例题,那就是逆波兰表达式的求值。
enum OPERATOR//定义一个枚举类型
{
DATA,//数字
ADD,//下面为操作
SUB,
MUL,
DIV,
};
struct Cell//定义一个结构体包含数据及操作
{
OPERATOR op;
int data;
};
int CalaRPN(Cell cell[],size_t size)//计算逆波兰表达式的值
{
stack<int> s;//将数字压栈或出栈来计算结果
size_t idx = 0;
for(idx = 0; idx < size; ++idx)
{
if(cell[idx].op == DATA)
{
s.push(cell[idx].data);//将数字push入栈
}
else
{
int right = s.top();//最开始的栈顶存放右操作数
s.pop();//将右操作数弹出
int left = s.top();//栈中的下一个数字为左操作数
s.pop();
switch(cell[idx].op)
{
case ADD:
s.push(left + right);
break;
case SUB:
s.push(left - right);
break;
case MUL:
s.push(left * right);
break;
case DIV:
s.push(left / right);
break;
default:
break;
}
}
}
return s.top();//最后的栈顶元素即为计算结果
}
int main()
{
//12*(3+4)-6+8/2==>12 3 4 + * 6 - 8 2 / +
Cell cell[] = {
{DATA,12},
{DATA,3},
{DATA,4},
{ADD,0},
{MUL,0},
{DATA,6},
{SUB,0},
{DATA,8},
{DATA,2},
{DIV,0},
{ADD,0}
};
cout<<CalaRPN(cell,sizeof(cell)/sizeof(cell[0]))<<endl;
system("pause");
return 0;
}
运行结果: