本計算器利用堆棧來實現。
1、定義後綴式計算器的堆棧結構
因為需要存儲的單元不多,這裡使用順序棧,即用一維數組來模擬堆棧:
#define MAX 100
int stack[MAX];
int top=0;
因此程序中定義了長度為MAX的一維數組,這裡MAX用宏定義為常數100,我們可以修改宏定義而重新定義堆棧的大小。
整型數據top為棧頂指示,由於程序開始時堆棧中並無任何數據元素,因此top被初始化為0。
2、存儲後綴式計算器的運算數
我們定義了堆棧stack[MAX]後,就可以利用入棧操作存儲先後輸入的兩個運算數。
下面看一下是如何實現的:
int push(int i) /*存儲運算數,入棧操作*/
{
if(top<MAX)
{
stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個位置*/
return 0;
}
else /*堆棧已滿,給出錯誤信息,返回出錯指示*/
{
printf("The stack is full");
return ERR;
}
}
我們在調用函數push時,假如它的返回值為0,說明入棧操作成功;否則,若返回值為ERR(在程序中說明為-1),說明入棧操作失敗。
3、從堆棧中取出運算數
當程序中讀完了四則運算符後,我們就可以從堆棧中取出已經存入的兩個運算數,構成表達式,計算出結果。取出運算數的函數采用的正是出棧算法。在本例中,實現該算法的函數 為pop():
int pop(); /*取出運算數,出棧操作*/
{
int var; /*定義待返回的棧頂元素*/
if(top!=NULL) /*堆棧中仍有數據元素*/
{
var=stack[top--]; /*堆棧指示下移一個位置*/
return var;
}
else /*堆棧為空,給出錯誤信息,並返回出錯返回值*/
printf("The stack is cmpty!
");
return ERR;
}
同樣,假如堆棧不為空,pop()函數返回堆棧頂端的數據元素,否則,給出棧空提示,並返回錯誤返回值ERR。
4、設計完整的後綴式計算器
有了堆棧存儲運算數,後綴式計算器的設計就很簡單了。程序首先提示用戶輸入第一個運算數,調用push()函數存入堆棧中;而後提示用戶輸入第二個運算數,同樣調用push()函數存入堆棧中。接下來,程序提示用戶輸入+,-,*,/四種運算符的一種,程序通過switch_case結構判定輸入運算符的種類,轉而執行不同的處理代碼。以除法為例,說明程序的執行流程:
case '/':
b=pop();
a=pop();
c=a/b;
printf("
The result is %d
",c);
printf("
");
break;
程序判定用戶輸入的是除號後,就執行上述代碼。首先接連兩次調用pop()函數從堆棧中讀出先前輸入的運算數,存入整型數a和b中;然後執行除法運算,結果存入單元c中。這時需要考慮究竟誰是被除數,誰是除數。由於開始我們先將被除數入棧,根據堆棧“先進後出”的原則,被除數應該是第二次調用pop()函數得到的返回值。而除數則是第一次調用pop()函數得到的返回值。
最後程序打印出運算結果,並示提示用戶是否繼續運行程序:
printf(" Continue?(y/n):");
l=getche();
if(l=='n')
exit(0);
假如用戶回答是"n",那麼結束程序,否則繼續循環。
完整的程序代碼如下:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define ERR -1
#define MAX 100 /*定義堆棧的大小*/
int stack[MAX]; /*用一維數組定義堆棧*/
int top=0; /*定義堆棧指示*/
int push(int i) /*存儲運算數,入棧操作*/
{
if(top<MAX)
{
stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個位置*/
return 0;
}
else
{
printf("The stack is full");
return ERR;
}
}
int pop() /*取出運算數,出棧操作*/
{
int var; /*定義待返回的棧頂元素*/
if(top!=NULL) /*堆棧中仍有元素*/
{
var=stack[top--]; /*堆棧指示下移一個位置*/
return var; /*返回棧頂元素*/
}
else
printf("The stack is empty!
");
return ERR;
}
void main()
{
int m,n;
char l;
int a,b,c;
int k;
do{
printf(" Ariothmatic Operate simulator
"); /*給出提示信息*/
printf("
Please input first number:"); /*輸入第一個運算數*/
scanf("%d",&m);
push(m); /*第一個運算數入棧*/
printf("
Please input second number:"); /*輸入第二個運算數*/
scanf("%d",&n);
push(n); /*第二個運算數入棧*/
printf("
Choose operator(+/-/*//):");
l=getche(); /*輸入運算符*/
switch(l) /*判定運算符,轉而執行相應代碼*/
{
case '+':
b=pop();
a=pop();
c=a+b;