逆波蘭計算器
#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;
}
相關文章
- 逆波蘭計算器分析和實現
- Java計算器(使用逆波蘭表示式演算法)Java演算法
- leetcode 224. 基本計算器(逆波蘭表示式)LeetCode
- C#資料結構與演算法系列(十):逆波蘭計算器——逆波蘭表示式(字尾表示式)C#資料結構演算法
- (詳細圖解) 逆波蘭表示式圖解
- 逆波蘭表示式求值 golang VS pythonGolangPython
- 我就給一個PHP逆波蘭表示式的演算法吧---工資計算專用PHP演算法
- 力扣-150. 逆波蘭表示式求值力扣
- 中綴表示式轉為逆波蘭表示式
- LeetCode-150- 逆波蘭表示式求值LeetCode
- Leetcode——150. 逆波蘭表示式求值LeetCode
- 4、逆波蘭表示式求值——棧(java資料結構)Java資料結構
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- 計算 CRC32 的逆函式函式
- 第八週(11.04-11.10)----結對專案----逆波蘭
- 計算器
- 前端菜鳥的每週一道演算法題(一) - 逆波蘭表示式求值前端演算法
- LeetCode 之 JavaScript 解答第150題 —— 逆波蘭表示式求值(Evaluate Reverse Polish Notation)LeetCodeJavaScript
- Java 計算器Java
- 日期計算器
- 健康計算器
- 四則運算計算器
- Java語言編寫計算器(簡單的計算器)Java
- android計算器Android
- web計算器案例Web
- c#計算器C#
- 簡單混合運算的計算器
- AUTOCAD——快速計算器
- 用VB寫計算器
- 簡單版計算器
- MFC簡單計算器
- PHP簡單計算器PHP
- 計算機器與智慧計算機
- javafx開發計算器Java
- Object-C,四則運算計算器Object
- 華為計劃在波蘭建立一個網路安全中心
- win10計算器怎麼用_win10如何開啟計算器Win10
- win10計算器在哪開啟_win10如何調出計算器Win10