程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 堆棧應用-後綴式四則計算器

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

編輯:C語言基礎知識
  本計算器利用堆棧來實現。
  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;
               
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved