逆波蘭計算器
#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)//push函式和pop函式反覆執行,pop為呼叫棧即存數陣列中的數,push函式將得到的數重新壓入棧中並
//用結果覆蓋pop函式呼叫的陣列順序較前的的數,後續getop的數繼續覆蓋
{
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>//isdigit函式判斷是否為數字,是數字返回1,不是返回0,
//ctype中還有isspace函式,用來判斷是否為空格/回車/製表符,如果是返回1,不是返回0
int getch(void);
void ungetch(int);
int getop(char s[])
{
int c, i;
while ((s[0] = c = getch()) == ' ' || c == '\t')//用來跳過空格
;//僅執行迴圈中的語句,直到不滿足迴圈條件
s[1] = '\0';
if (!isdigit(c) && c != '.')//isdigit函式取反,表示不是數字的直接返回讀入的字元c
return c;//將讀入的運算子號返回給主調函式
i = 0;
if (isdigit(c))//讀入整數部分
while (isdigit(s[++i] = c = getch()))//判斷是否為數字,如果是,繼續迴圈並將該數字存入陣列s中
;
if (c == '.')//讀入到小數點後開始讀入小數部分
while (isdigit(s[++i] = c = getch()))//小數部分的讀入
;
s[i] = '\0';//char型別的陣列以'\0'結尾,此處還覆蓋了最後讀入的最後那位不是是數字的字元
if (c != EOF)
ungetch(c);//儲存小數讀完後的字元,以便下次進行比對,僅執行一次!
return NUMBER;//表明egtop函式這次執行讀入的是數字而非運算子
}
#define BUFSIZE 100
char buf[BUFSIZE];//ungetch函式的緩衝區
int bufp = 0;
int getch(void)//將buf陣列記憶體儲的字元返還給新一輪的getop或者當bufp減到0後用getchar函式輸入新的字元
{
return (bufp > 0) ? buf[–bufp] : getchar();
}
void ungetch(int c)//用buf陣列儲存getop在讀完小數部分後讀入的字元
{
if (bufp >= BUFSIZE)
printf(“ungetch: too many characters\n”);
else
buf[bufp++] = c;
}
相關文章
- 逆波蘭計算器分析和實現
- leetcode 224. 基本計算器(逆波蘭表示式)LeetCode
- C#資料結構與演算法系列(十):逆波蘭計算器——逆波蘭表示式(字尾表示式)C#資料結構演算法
- 遞迴:逆波蘭表示式遞迴
- Leetcode——150. 逆波蘭表示式求值LeetCode
- LeetCode-150- 逆波蘭表示式求值LeetCode
- 逆波蘭表示式求值 golang VS pythonGolangPython
- (詳細圖解) 逆波蘭表示式圖解
- 逆波蘭表示式求值——棧與佇列佇列
- 力扣-150. 逆波蘭表示式求值力扣
- 中綴表示式轉為逆波蘭表示式
- 4、逆波蘭表示式求值——棧(java資料結構)Java資料結構
- 關於利用STL棧求解四則中綴表示式以及中綴表示式轉逆波蘭表示式和逆波蘭表示式的求解
- Task A1 中綴表示式轉換為逆波蘭式
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- LeetCode 之 JavaScript 解答第150題 —— 逆波蘭表示式求值(Evaluate Reverse Polish Notation)LeetCodeJavaScript
- 前端菜鳥的每週一道演算法題(一) - 逆波蘭表示式求值前端演算法
- 計算 CRC32 的逆函式函式
- 2018世界盃日本VS波蘭加誰會贏 日本vs波蘭比分預測
- 華為計劃在波蘭建立一個網路安全中心
- 2018世界盃日本vs波蘭影片錄播 日本0-1波蘭回放影片
- 波蘭小哥花了十年,造了個殭屍機器人機器人
- 計算器
- 2018世界盃波蘭vs哥倫比亞誰會贏 波蘭vs哥倫比亞比分預測
- 2018世界盃波蘭vs塞內加爾比分預測 波蘭vs塞內加爾誰會贏
- 2018世界盃波蘭vs哥倫比亞影片錄播 波蘭0-3哥倫比亞影片回放
- OpenCV計算機視覺學習(4)——影像平滑處理(均值濾波,高斯濾波,中值濾波,雙邊濾波)OpenCV計算機視覺
- 四則運算計算器
- 計算斐波那契數列的演算法演算法
- Hyperf 釋出輕量級有向無環圖任務編排庫和逆波蘭表示法孵化元件以及 v2.1.4 版本元件
- 計算機之父阿蘭·圖靈傳奇的一生計算機圖靈
- Netflix推出首款手遊,已於波蘭測試
- c#計算器C#
- AUTOCAD——快速計算器
- 波蘭人眼中盜版、加班和遊戲妖魔化遊戲
- 波蘭的獨立遊戲,我只能說是真的棒遊戲
- 華為Mate 20系列以及HUAWEI WATCH GT正式上市波蘭
- 簡單混合運算的計算器