中易网

描述程序中的逆波兰式是怎么生成的

答案:2  悬赏:50  
解决时间 2021-05-25 09:32
描述程序中的逆波兰式是怎么生成的
最佳答案
我转别人的答案 我是学JAVA的
#include <stdio.h>
#include <stdlib.h>    
#define MAXOP   100    
#define NUMBER  '0'    
int getOp(char []);
void push(double);
double pop(void);
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.0)    push(pop() / op2);    else    puts("error: zero divisor\n");    break;    case '\n':    printf("\t%.8g\n", pop());    break;    default:    printf("error: unknown command %s\n", s);    break;    }    }    return 0;
}

#define MAXVAL  100    
int sp = 0;    
double val[MAXVAL];    

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 {    puts("error: stack empty\n");    return 0.0;    }
}

#include <ctype.h>
int getChar_localVersion(void);
void ungetChar_localVersion(int c);

int getOp(char s[]) {    int i, c;    while ((s[0] = c = getChar_localVersion()) == ' ' || c == '\t')    ;    s[1] = '\0';    if (!isdigit(c) && c != '.' && c != '-')    return c;        i = 0;    if (c == '-')        if(isdigit(s[1] = c = getChar_localVersion()))    ++i;    else {    ungetChar_localVersion(c);    s[1] = '\0';    return s[0];    }    if (isdigit(c))        while (isdigit(s[++i] = c = getChar_localVersion()))    ;    if (c == '.')        while (isdigit(s[++i] = c = getChar_localVersion()))    ;    s[i] = '\0';    if (c != EOF)    ungetChar_localVersion(c);    return NUMBER;
}

#define BUFSIZE 100
char buf[BUFSIZE];    
int bufp = 0;    

int getChar_localVersion(void) {    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetChar_localVersion(int c) {    if (bufp >= BUFSIZE)    puts("ungetChar_localVersion: too many characters\n");    else    buf[bufp++] = c;
}
参考资料:The C Programming Language, 2nd Edition, 1988 ( Brian Kernighan & Dennis Ritchie )
全部回答

这个用C语言是很方便的!可以直接运行的!

#include <stdio.h> #include <stdlib.h>     #define MAXOP   100     #define NUMBER  '0'     int getOp(char []); void push(double); double pop(void); 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.0)     push(pop() / op2);     else     puts("error: zero divisor\n");     break;     case '\n':     printf("\t%.8g\n", pop());     break;     default:     printf("error: unknown command %s\n", s);     break;     }     }     return 0; } #define MAXVAL  100     int sp = 0;     double val[MAXVAL];     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 {     puts("error: stack empty\n");     return 0.0;     } } #include <ctype.h> int getChar_localVersion(void); void ungetChar_localVersion(int c); int getOp(char s[]) {     int i, c;     while ((s[0] = c = getChar_localVersion()) == ' ' || c == '\t')     ;     s[1] = '\0';     if (!isdigit(c) && c != '.' && c != '-')     return c;         i = 0;     if (c == '-')         if(isdigit(s[1] = c = getChar_localVersion()))     ++i;     else {     ungetChar_localVersion(c);     s[1] = '\0';     return s[0];     }     if (isdigit(c))         while (isdigit(s[++i] = c = getChar_localVersion()))     ;     if (c == '.')         while (isdigit(s[++i] = c = getChar_localVersion()))     ;     s[i] = '\0';     if (c != EOF)     ungetChar_localVersion(c);     return NUMBER; } #define BUFSIZE 100 char buf[BUFSIZE];     int bufp = 0;     int getChar_localVersion(void) {     return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetChar_localVersion(int c) {     if (bufp >= BUFSIZE)     puts("ungetChar_localVersion: too many characters\n");     else     buf[bufp++] = c;

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
关于年轻人坏习惯的报告(含问卷调查的)
全国大学的排名最新
登封市新生活化妆品(嵩阳路)地址有谁知道?有
DNF天脊乾坤剑和千年之光在那爆的?
工商银行的卡可以在建设银行取款机转帐吗
DNF我56级 金币交易上限是多少?
你是地球人吗?
美女 Q聊怎么样
QQ农场常遇见的事情
永清县中国太平洋财产保险股份有限公司这个地
如何客观地评价秦始皇,简洁一点
桌面上打开我的电脑,点击D,E,F盘,出现的都
上海2 35最上紫扫把卖多少
怎么才算爱她
如何能忘记一个人,
推荐资讯
白菜怎样做才好吃
dnf剩下74KB不能自己更新
元坝镇计划生育服务站在哪里啊,我有事要去这
笔记本电脑突然停机是啥原因
怎样才能做到"淑女"呢?
现在买什么手机好点?
痔仓手术完打完点滴后头晕无力痰多?
下辈子愿意做一只狗,一条野狗
地下城的东西啊
襄阳
为什么我的QQ老是有人上、我改密码了的?
海蚌食用方法
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?