c语言逆波兰式算法,c语言 逆波兰式输入 计算器程序

#include

#include

#include

#define MAXOP 100

#define NUMBER '0'

int getop(char []) ;

void push(double) ;

double pop(void) ;

/*逆波兰式输入计算器程序*/

main()

{

char s[MAXOP] ;

int type ;

double op2 ;

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)

push(pop()/op2) ;

else

printf("error : zero divisor\n") ;

break ;

case '%' :

op2 = pop() ;

if(op2)

push(fmod(pop(),op2)) ;

else

printf("error:") ;

break ;

case '\n' :

printf("\t%.8g\n",pop()) ;

break ;

default :

printf("ERROR! unknown command %s \n") ;

break ;

}

}

}

/*构建栈*/

#define MAXVAL 100

#define OK 1

#define TRUE 1

#define FALSE 0

double val[MAXVAL] ;

int sp = 0 ;

void push(double f)

{

if(sp < MAXVAL)

val[sp++] = f ;

else

printf("error : stack full ,can't push %g\n",f) ;

}

double pop(void)

{

if(sp > 0)

return(val[--sp]) ;

else {

printf("error : stack empty\n") ;

return 0.0 ;

}

}

#include

int getch(void) ;

void ungetch(int) ;

int getop(char s[])

{

int i , c ;

i = 0 ;

while(( s[0] = c = getch()) == ' ' || c == '\t') ;

s[1] = '\0' ;

if(!isdigit(c) && c != '.' && c != '-')

return c ;

if(c == '-')

if(isdigit(c = getch())||c == '.')

s[++i] = c ;

else{

if(c != EOF)

ungetch(c) ;

return '-' ;

}

if(isdigit(c))

while(isdigit(s[++i] = c = getch())) ;

if(c == '.')

while(isdigit(s[++i] = c = getch())) ;

s[i] = '\0' ;

if(c != EOF)

ungetch(c) ;

return NUMBER ;

}

#define BUFSIZE 100

char buf[BUFSIZE] ;

int bufp = 0 ;

int getch(void)

{

return (bufp > 0) ? buf[--bufp] : getchar() ;

}

void ungetch(int c)

{

if(bufp >= BUFSIZE)

printf("error:too many characters\n") ;

else

buf[bufp++] = c ;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值