逆波蘭計算器

十七歲程式設計男神發表於2020-12-16

#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;
}

相關文章