国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

堆棧應用-后綴式四則計算器

2019-11-17 05:36:32
字體:
來源:轉載
供稿:網友

  本計算器利用堆棧來實現。
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                /*堆棧已滿,給出錯誤信息,返回出錯指示*/
    {
                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!/n");
    return ERR;
}
    同樣,假如堆棧不為空,pop()函數返回堆棧頂端的數據元素,否則,給出棧空提示,并返回錯誤返回值ERR。
4、設計完整的后綴式計算器
    有了堆棧存儲運算數,后綴式計算器的設計就很簡單了。程序首先提示用戶輸入第一個運算數,調用push()函數存入堆棧中;而后提示用戶輸入第二個運算數,同樣調用push()函數存入堆棧中。接下來,程序提示用戶輸入+,-,*,/四種運算符的一種,程序通過switch_case結構判定輸入運算符的種類,轉而執行不同的處理代碼。以除法為例,說明程序的執行流程:
        case '/':
            b=pop();
            a=pop();
            c=a/b;
            printf("/n/nThe result is %d/n",c);
            printf("/n");
            break;
    程序判定用戶輸入的是除號后,就執行上述代碼。首先接連兩次調用pop()函數從堆棧中讀出先前輸入的運算數,存入整型數a和b中;然后執行除法運算,結果存入單元c中。這時需要考慮究竟誰是被除數,誰是除數。由于開始我們先將被除數入棧,根據堆棧“先進后出”的原則,被除數應該是第二次調用pop()函數得到的返回值。而除數則是第一次調用pop()函數得到的返回值。
    最后程序打印出運算結果,并示提示用戶是否繼續運行程序:
printf("/t 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!/n");
    return ERR;
}
void main()
{
    int m,n;
    char l;
    int a,b,c;
    int k;
    do{
        printf("/tAriothmatic
Operate simulator/n");    /*給出提示信息*/
        printf("/n/tPlease input first number:");      /*輸入第一個運算數*/
        scanf("%d",&m);
        push(m);            /*第一個運算數入棧*/
        printf("/n/tPlease input second number:");    /*輸入第二個運算數*/
        scanf("%d",&n);
        push(n);            /*第二個運算數入棧*/
        printf("/n/tChoose operator(+/-/*//):");
        l=getche();         /*輸入運算符*/
        switch(l)            /*判定運算符,轉而執行相應代碼*/
        {
            case '+':
                b=pop();
                a=pop();
                c=a+b;
             


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河津市| 怀集县| 长治市| 湖南省| 南投市| 东台市| 梁平县| 那坡县| 皋兰县| 灌南县| 大埔区| 叶城县| 贺兰县| 平泉县| 额敏县| 子长县| 松滋市| 元江| 福安市| 扎兰屯市| 修文县| 巢湖市| 永善县| 调兵山市| 裕民县| 台东市| 温州市| 高州市| 静乐县| 杂多县| 巍山| 永靖县| 油尖旺区| 建湖县| 望都县| 错那县| 芮城县| 祁门县| 宁陕县| 博客| 合肥市|