#include <stdio.h>
#include <stdlib.h>
#define MAXBUF 5
int sp = 0;
int buf[MAXBUF];
int push(int f)
{
if (sp < MAXBUF) {
buf[sp++] = f;
return 0;
} else {
return 1;
}
}
int pop(int *rc)
{
if (sp > 0) {
*rc = buf[--sp];
return 0;
} else {
return -1;
}
}
void print_stack(void)
{
int i;
putchar('\n');
for(i = MAXBUF-1; i >= 0; --i){
i >= sp ? printf(" | |\n") : printf(" |%5d|\n", buf[i]);
}
printf(" +-----+\n");
}
int main(void)
{
int v1, v2, val;
char c[2];
int menu;
do{
printf("(1)Number (2)Operator (0)Result and Exit :");
if (scanf("%d", &menu) != 1) {
menu = -1;
while (getchar() != '\n')
;
}
switch(menu){
case 1:
printf("Number: ");
scanf("%d", &val);
if (push(val))
printf("Stack Overflow!\n");
print_stack();
break;
case 2:
printf("Operator: ");
scanf("%1s", c);
if (pop(&v1)) {
printf("Stack is Empty!\n");
break;
}
if (pop(&v2)) {
printf("Stack is Empty!\n");
break;
}
switch (c[0]) {
case '+':
push(v2 + v1);
break;
case '-':
push(v2 - v1);
break;
case '*':
push(v2 * v1);
break;
case '/':
if (v1 == 0) {
printf("Stack is Empty!\nStack Pop is failed!\n");
push(v2);
push(v1);
break;
}
push(v2 / v1);
break;
default:
printf("Bad operator.\n");
push(v2);
push(v1);
}
print_stack();
break;
case 0:
if (pop(&val)) {
printf("Stack is Empty!\n");
break;
}
printf("Result = %d\n", val);
break;
default:
menu = -1;
break;
}
} while(menu != 0);
return 0;
}
/* end */