//.h
#define MAX_SIZE 1024
typedef int DataType;
typedef char DataType;typedef struct Stack
{
DataType _array[MAX_SIZE];
int _top; // 表示有效元素个数 表示栈顶位置
// int _capacity; // 底层空间的总大小
}Stack;
typedef enum
{
ADD,SUB,MUL,DIV,DATA
}OPERATOR;
typedef struct Cell
{
OPERATOR _op;
int _data;
}Cell;
void StackInit(Stack* s);
// 入栈
void StackPush(Stack* s, DataType data);
// 出栈
void StackPop(Stack* s);
// 获取栈顶元素
DataType StackTop(Stack* s);
// 有效元素的个数
int StackSize(Stack* s);
// 检测栈是否为空
int StackEmpty(Stack* s);
#include"Stack.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void StackInit(Stack* s)
{
assert(s);
s->_top = 0;
}
// 入栈
void StackPush(Stack* s, DataType data)
{
assert(s);
if(MAX_SIZE == s->_top)
printf("栈已满,放不了!!!");
s->_array[s->_top++] = data;
}
// 出栈
void StackPop(Stack* s)
{
if(StackEmpty(s))
return;
s->_top--;
}
// 获取栈顶元素
DataType StackTop(Stack* s)
{
assert(s);
assert(!StackEmpty(s));
return s->_array[s->_top-1];
}
// 有效元素的个数
int StackSize(Stack* s)
{
assert(s);
return s->_top;
}
// 检测栈是否为空
int StackEmpty(Stack* s)
{
assert(s);
return s->_top == 0;
}
///.c
int CalcRPN(Cell RPN[],int size)
{
int i =0;
Stack s;
StackInit(&s);
for(; i<size ; ++i)
{
if(DATA == RPN[i]._op)
StackPush(&s,RPN[i]._data);
else
{
int left = 0 , right = 0;
right = StackTop(&s);
StackPop(&s);
switch(RPN[i]._op)
{
case ADD:
StackPush(&s , left + right);
break;
case SUB:
StackPush(&s , left - right);
break;
case MUL:
StackPush(&s , left * right);
break;
case DIV:
if(0 == right)
{
printf("除数为0,非法!\n");
return 0;
}
StackPush(&s , left / right);
break;
}
}
}
StackPop(&s);
}
void TestRPN()
{
//12 3 4 + * 6 - 8 2 / +
Cell RPN[]={{DATA,12},{DATA,3},{DATA,4},
{ADD,0},{MUL,0},{DATA,6},{SUB,0},
{DATA,8},{DATA,2},{DIV,0},{ADD,0}};
printf("%d\n",CalcRPN(RPN,sizeof(RPN)/sizeof(RPN[0])));
}
int main()
{
TestRPN();
system("pause");
return 0;
}