/************************************************************************/
/* 利用栈实现反向Polish计算器:比如,输入1 2 +,其实是要计算1 + 2;
/* 比如输入1 2 + 4 5 - *,其实是要计算(1 + 2) * (4 - 5)
/************************************************************************/
#include <stdio.h>
#include <stdlib.h> /*for atof()*/
#include <ctype.h>
#define MAXOP 100 /*max size of operator or operand*/
#define NUMBER '0' /*signal that a number was found*/
#define MAXVAL 100 /*maximum depth of val stack*/
int getop(char []);
void push(double);
double pop(void);
/*Reverse Polish calculator*/
main(){
int type;
double op2;
char s[MAXOP];
while ((type = getop(s)) != EOF) {
switch(type) {
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 != 0) {
push(pop() / op2);
}else{
printf("error : zero divisor\n");
}
break;
case '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("error : unknown command %s\n" , s);
break;
}
}
return 0;
}
int sp = 0; /*next free stack position*/
double val[MAXVAL]; /*value stack*/
/*push : push f onto value stack*/
void push(double f){
if (sp < MAXVAL) {
val[sp++] = f;
}
else{
printf("error : stack full, can't push %g\n", f);
}
}
double pop(){
if (sp > 0) {
return val[--sp];
}else{
printf("error : stack empty\n");
return 0.0;
}
}
int getch(void);
void ungetch(int);
/*getop : get next operator or numeric operand*/
int getop(char s[]){
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t') {
// do nothing;
}
s[1] = '\0';
if ( !isdigit(c) && c != '.') {
return c;// not a number
}
i = 0;
if (isdigit(c)) { // collect integer part
while (isdigit( s[++i] = c = getch()) ){
//
}
}
if (c == '.') { // collect fraction part
while (isdigit( s[++i] = c = getch()) ){
//
}
}
s[i] = '\0';
if (c != EOF) {
ungetch(c);
}
return NUMBER;
}
char buf[BUFSIZ];// buffer for ungetch
int bufp = 0; // next free position in buf
int getch(void){
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c){// push character back on input
if (bufp >= BUFSIZ) {
printf("ungetch : too many characters\n");
}
else{
buf[bufp ++] = c;
}
}
C语言利用栈实现Polish计算器
最新推荐文章于 2023-11-16 18:37:36 发布