C語言棧實現逆波蘭演算法

來源:互聯網
上載者:User

逆波蘭式也叫尾碼運算式(將運算子寫在運算元之後) 如:我們平時寫a+b,這是中綴運算式,寫成尾碼運算式就是:ab+
先說明一下裡面用到的基礎
1.atof() 把字串指標轉化為浮點數
2.getchar有一個int型的傳回值.當程式調用getchar時.程式就等著使用者按鍵.使用者輸入的字元被存放在鍵盤緩衝區中.直到使用者按斷行符號為止(斷行符號字元也放在緩衝區中).當使用者鍵入斷行符號之後,getchar才開始從stdio流中每次讀入一個字元.getchar函數的傳回值是使用者輸入的第一個字元的ASCII碼,如出錯返回-1,且將使用者輸入的字元回顯到螢幕.如使用者在按斷行符號之前輸入了不止一個字元,其他字元會保留在鍵盤緩衝區中,等待後續getchar調用讀取.也就是說,後續的getchar調用不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完為後,才等待使用者按鍵.

3.getch與getchar準系統相同,差別是getch直接從鍵盤擷取索引值,不等待使用者按斷行符號,只要使用者按一個鍵,getch就立刻返回, getch傳回值是使用者輸入的ASCII碼,出錯返回-1.輸入的字元不會回顯在螢幕上.getch函數常用於程式調試中,在調試時,在關鍵位置顯示有關的結果以待查看,然後用getch函數暫停程式運行,當按任意鍵後程式繼續運行.Code
#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)   
{   
    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>   
int   getch(void);   
void   ungetch(int);   
  
int   getop(char   s[])   
{   
    int   i,c;   
    while   ((s[0]=c=getch())==' '|| c=='\t');   
        s[1]='\0';   
    if(!isdigit(c)&&c!='.')   
        return   c;   
    i=0;   
    if(isdigit(c))   
        while   (isdigit(s[++i]=c=getch()));   
    if   (c=='.')   
        while   (isdigit(s[++i]=c=getch()));   
            s[i]='\0';   
    if   (c!=EOF)   
        ungetch(c);   
    return   NUMBER;   
}   
  
  
#define   BUFSIZE   100   
char   buf[BUFSIZE];   
int   bufp=0; 

int   getch(void)   
{   
    return(bufp>0) ? buf[--bufp]:getchar();   
}

void ungetch(int c)   
{   
    if (bufp>=BUFSIZE)   
        printf("ungetch:too   many   characters\n");   
    else   
        buf[bufp++]=c;   
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.