逆波兰表达式
逆波兰表达式又称后缀表达式,它的表示方法通常都是操作数在前,操作符在后。
比如: 通常 逆波兰表达式
1+2 1 2 +
2-3*4/5 2 3 4 * - 5 /
12*(3+4)-6+8/2 12 3 4 + * 6 - 8 2 / +
分析:
先取到一个字符:
1.数字。 压栈
2.表达式。 从栈中拿到表达式前边两个数(出栈),
一个数为表达式右边的数,第二个为表达式左边的数
在除法运算中,第二个数不能为0;
看代码:
sum.h
#ifndef __STACK_H__
#define __STACK_H__
typedef int DataType;
enum xxx
{
ADD,
SUB,
MID,
DIV,
DATA,
};
typedef struct cell
{
char SIZE;
int data;
}CELL;
typedef struct Node
{
DataType data[10];
int sz;
}Stack;
void Initstack(Stack * stack);
void Pushstack(Stack * stack, DataType d);
void Popstack(Stack * stack);
int Topstack(Stack stack);
int PostfixExpression(const CELL* str,int size);
#endif
sum.c
#include"sum.h"
#include<assert.h>
#include<stdio.h>
#include<string.h>
void Initstack(Stack * stack)
{
assert(stack!=NULL);
memset(stack, sizeof(stack->data), 4);
stack->sz = 0;
}
void Pushstack(Stack * stack, DataType d)//压栈
{
assert(stack != NULL);
stack->data[stack->sz] = d;
stack->sz++;
}
void Popstack(Stack * stack)//出栈
{
assert(stack != NULL);
stack->data[stack->sz - 1] = 0;
stack->sz--;
}
int Topstack(Stack stack)
{
return stack.data[stack.sz - 1];
}
int PostfixExpression(const CELL* str, int size)
{
Stack stack;
Initstack(&stack);
int i = 0;
for (i = 0; i < size; i++)
{
if (str[i].SIZE == DATA)//取出字符为数字
{
Pushstack(&stack,str[i].data);
}
else//取出字符为表达式
{
int left = 0;
int right = 0;
right = Topstack(stack);
Popstack(&stack);
left = Topstack(stack);
Popstack(&stack);
switch (str[i].SIZE)
{
case ADD:
Pushstack(&stack, left + right);
break;
case SUB:
Pushstack(&stack, left - right);
break;
case MID:
Pushstack(&stack, left * right);
break;
case DIV:
if (right == 0)//除数是否为0?
{
return 0;
}
else
Pushstack(&stack, left / right);
break;
}
}
}
return Topstack(stack);
}
test.c
#include<windows.h>
#include<stdio.h>
#include"sum.h"
int main()
{
CELL cell[] = { { DATA, 12 }, { DATA, 3 }, { DATA, 4 }, { ADD, 0 }, { MID, 0 }, { DATA, 6 }, { SUB, 0 }, { DATA, 8 }, { DATA, 2 }, { DIV, 0 }, { ADD, 12 } };
int size = sizeof(cell)/sizeof(cell[0]);
int ret = PostfixExpression(cell, size);
if (ret == 0)
printf("除数为0,不符合运算规则\n");
else
printf("%d\n", ret);
system("pause");
return 0;
}