C语言栈实现逆波兰算法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C语言栈实现逆波兰算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                逆波蘭式也叫后綴表達式(將運算符寫在操作數之后) 如:我們平時寫a+b,這是中綴表達式,寫成后綴表達式就是:ab+ 
先說明一下里面用到的基礎
1.atof() 把字符串指針轉化為浮點數
2.getchar有一個int型的返回值.當程序調用getchar時.程序就等著用戶按鍵.用戶輸入的字符被存放在鍵盤緩沖區中.直到用戶按回車為止(回車字符也放在緩沖區中).當用戶鍵入回車之后,getchar才開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的ASCII碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕.如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待后續getchar調用讀取.也就是說,后續的getchar調用不會等待用戶按鍵,而直接讀取緩沖區中的字符,直到緩沖區中的字符讀完為后,才等待用戶按鍵.
Code
#include???<stdio.h>???
#include???<stdlib.h>???
#define?????MAXOP?????100???
#define?????NUMBER?????'0'???
int???getop???(char???[]???);???
void???push???(double);???
double???pop(void);???
??
int?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???
??????????????????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;???
}???
??
??
#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???{???
????????????printf("error:stack???empty\n");???
????????????return???0.0;???
????????????}???
}???
??
#include???<ctype.h>???
int???getch(void);???
void???ungetch(int);???
??
int???getop(char???s[])???
{???
????int???i,c;???
????while???((s[0]=c=getch())=='?'||?c=='\t');???
????????s[1]='\0';???
????if(!isdigit(c)&&c!='.')???
????????return???c;???
????i=0;???
????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("ungetch:too???many???characters\n");???
????else???
????????buf[bufp++]=c;???
}
轉載于:https://www.cnblogs.com/songQQ/archive/2009/09/22/1571613.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C语言栈实现逆波兰算法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 中国直销未来三五年的发展趋势[转]
- 下一篇: 如何看Linux服务器是否被攻击
