逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
//用的栈是自己封装的栈,也发了
#include "stach.h"
//定义宏
#define SHOW(f) \
ELEMENT* p = _pop(stack); \ //出栈
ELEMENT* q = _pop(stack); \
if (p == NULL){printf("表达式错误\n");return;}\
if (q == NULL){printf("表达式错误\n");return;}\
element.index = q->index ##f p->index; \
printf("%d %s %d = %d\n", q->index, #f, p->index, element.index); \
push(stack, element);//压栈
void RPN(STACK* stack, ELEMENT element, char* arrs){
if (strrchr(arrs, ' ') == NULL){
element.index = atoi(arrs);
push(stack, element);
return;
}
char* sign = strrchr(arrs, ' ') + 1;
//判断是符号还是数字
if (strcmp(sign, "+") == 0 || strcmp(sign, "-") == 0 || strcmp(sign, "*") == 0 || strcmp(sign, "/") == 0){}
else{
//字符串的截取
element.index = atoi(strrchr(arrs, ' ') + 1);
}
memset(strrchr(arrs, ' '), 0, 1);
RPN(stack, element, arrs);
switch (*sign)
{
case '+':
{
SHOW(+);
break;
}
case '-':
{
SHOW(-);
break;
}
case '*':
{
SHOW(*);
break;
}
case '/':
{
SHOW(/);
break;
}
default:
push(stack, element);
break;
}
}
#undef SHOW;
void main(){
STACK stack = { 0 };
ELEMENT elements = { 0 };
//当初定义栈元素的时候有个name
strcpy(elements.name, " ");
char arrs[128] = { 0 };
gets(arrs);
RPN(&stack, elements, arrs);
show(stack);
getchar();
}