C++数据结构之栈的应用2:逆波兰(后缀)表达式
1.什么是逆波兰表达式
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
---------来自百度百科
用表达式来解释是这样的:
原始 | 后缀表达式 |
---|---|
a+b | a b + |
a+(b+c)*d | a b c + d * + |
结合栈的知识,理解起来也不难,以表格遇到数据先压栈,遇到符号出栈。
使用逆波兰表达式,正是计算机所喜欢的,不需要考虑优先级,大大节省了计算时间。
#include <iostream>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define ADD 10
using namespace std;
typedef struct
{
char *base;
char *top;
int stackSize;
}sqStack;
void initstack(sqStack *s)
{
s->base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
if (!s->base)
{
exit(0);
}
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}
void push(sqStack *s,char data)
{
if ( s->top - s->base >= s->stackSize)
{
s->base = (char *)realloc(s->base,(s->stackSize+ADD)*sizeof(char));
if (!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize += ADD;
}
*s->top = data;
s->top++;
}
void pop(sqStack *s,char &data)
{
if (s->base == s->top)
cout << "栈满了"<< endl;
else
{
data = *--s->top;
}
}
int getlen(sqStack s)
{
return(s.top - s.base);
}
void print(sqStack s)
{
char e;
int len = getlen(s);
for (int i = 0; i< len;i++)
{
pop(&s,e);
cout << e ;
}
cout << endl;
}
int main()
{
char a,b,c;
int d;
sqStack s;
initstack(&s);
cout << "按后缀表达式的格式输入:"<<endl;
while(1)
{
cin >> c;
if (c == '#')
break;
else
{
switch(c)
{
case '+':
pop(&s,a);
pop(&s,b);
push(&s,a+b);
break;
case '-':
pop(&s,a);
pop(&s,b);
push(&s,b-a);
break;
case '*':
pop(&s,a);
pop(&s,b);
push(&s,a*b);
break;
case '/':
pop(&s,a);
if (0 == a)
cout <<"错误,除数为0"<<endl;
else
pop(&s,b);
push(&s,b/a);
break;
default:
push(&s,c);
break;
}
}
}
char result;
pop(&s,result);
cout << result-0 <<endl;
}