模拟栈 stack.h
#inndef _STACK_H
#define _STACK_H
typedef char Bool;
typedef int StackType;
typedef struct stack stack;
#define false 0
#define true 1
#define MAXSIZE 100
struct stack
{
StackType buf[MAXSIZE];
int top;
};
extern Bool isEmpty(stack *ps);
extern Bool isFull(stack *ps);
extern void initStack(stack *ps);
extern Bool push(stack *ps,StackType data);
extern Bool pop(stack *ps,StackType *pdata);
#endif
stack.c
#include <stdio.h>
#include "stack.h"
Bool isEmpty(stack *ps)
{
if(-1 == ps->top)
return true;
else
return false;
}
Bool isFull(stack *ps)
{
if(MAXSIZE-1 == ps->top)
return true;
else
return false;
}
void initStack(stack *ps)
{
ps->top = -1;
}
Bool push(stack *ps,StackType data)
{
if(isFull(ps))
return false;
ps->buf[++(ps->top)] = data;
return true;
}
Bool pop(stack *ps,StackType *pdata)
{
if(isEmpty(ps))
return false;
*pdata = ps->buf[(ps->top)--];
return true;
}
calc.c
#include <stdio.h>
#include "stack.h"
void main()
{
struct stack s;
initStack(&s);
char opr[] = "32546*+*+41*+";
int i=0;
while('\0' != opr[i++])
{
//num push
if(opr[i]>='0' && opr[i]<='9')
{
if(!push(&s,(opr[i]-'0')))
{
printf("length not enough\n");
return;
}
}
//ch pop two calc push
else if('+'==opr[i] || '-' == opr[i] || '*' == opr[i] || '/' == opr[i])
{
int num1,num2;
if(!pop(&s,&num1) || !pop(&s,&num2))
{
return;
}
int value;
switch(opr[i])
{
case '+':
value = num2+num1;
break;
case '-':
value = num2-num1;
break;
case '*':
value = num2*num1;
break;
case '/':
value = num2/num1;
break;
}
if(!push(&s,value))
{
printf("length not enough\n");
return;
}
}
else
{
printf(" input error\n");
return;
}
}
int ret;
pop(&s,&ret);
printf("%s = %d\n",opr,ret);
}