逆波蘭運算式

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   for   art   

一、 將中綴運算式轉換成尾碼運算式演算法:1、從左至右掃描 中綴運算式。2、若讀取的是運算元(數字),則判斷該運算元的類型,並將該運算元存入運算元堆棧3、若讀取的是運算子(1) 該運算子為左括弧"(",則直接存入運算子堆棧。(2) 該運算子為右括弧")",則輸出運算子堆棧中的運算子到運算元堆棧,直到遇到左括弧為止。(3) 該運算子為非括弧運算子:(a) 若運算子堆棧棧頂的運算子為括弧,則直接存入運算子堆棧。(b) 若比運算子堆棧棧頂的運算子優先順序高或相等,則直接存入運算子堆棧。(c) 若比運算子堆棧棧頂的運算子優先順序低,則輸出棧頂運算子到運算元堆棧,並將當前運算子壓入運算子堆棧。4、當運算式讀取完成後運算子堆棧中尚有運算子時,則依序取出運算子到運算元堆棧,直到運算子堆棧為空白。 二、逆波蘭運算式求值演算法:1、迴圈掃描文法單元的項目。2、如果掃描的項目是運算元,則將其壓入運算元堆棧,並掃描下一個項目。3、如果掃描的項目是一個二元運算子,則對棧的頂上兩個運算元執行該運算。4、如果掃描的項目是一個一元運算子,則對棧的最頂上運算元執行該運算。5、將運算結果重新壓入堆棧。6、重複步驟2-5,全部運算完後,最後堆棧中數 即為結果值。 連結:逆波蘭運算式求值 
#include<stdio.h>  #include<stdlib.h>  typedef struct stu  {      char s;      struct stu *next;  }stack;  void push(stack **top,char c)  {      stack *p;      p=(stack *)malloc(sizeof(stack));      p->s=c;      p->next=(*top);      *top=p;  }  void pop(stack **top)  {      *top=(*top)->next;  }  int yxj(char a,char b)  {      if((a==‘+‘||a==‘-‘)&&(b==‘*‘||b==‘\\‘))          return 0;      return 1;  }  int main()  {      stack *top=NULL;      int m[110];      char s[110],c[110]={0};      int i,j=0,t=1;      gets(s);      for(i=0;s[i]!=‘@‘;i++){          if(s[i]>=‘0‘&&s[i]<=‘9‘){              c[j++]=s[i];              t=0;          }          else{              if(t==0){                  c[j++]=‘ ‘;                  t=1;              }              if(top==NULL||s[i]==‘(‘||(s[i]!=‘)‘&&yxj(s[i],top->s)))                  push(&top,s[i]);              else{                  if(s[i]==‘)‘){                      while(top->s!=‘(‘){                          c[j++]=top->s;                          pop(&top);                      }                      pop(&top);                  }                  else{                      while(top!=NULL&&(!yxj(s[i],top->s))){                          c[j++]=top->s;                          pop(&top);                      }                      push(&top,s[i]);                  }              }          }      }      if(t==0)          c[j++]=‘ ‘;      while(top!=NULL){          c[j++]=top->s;          pop(&top);      }      c[j]=0;      j=0;      for(i=0;c[i]!=‘\0‘;i++){          if(c[i]>=‘0‘&&c[i]<=‘9‘){              t=0;              for(;c[i]!=‘ ‘;i++)                  t=t*10+c[i]-48;              m[j++]=t;          }          else{              if(c[i]==‘+‘)                  m[j-2]=m[j-2]+m[j-1];              else if(c[i]==‘-‘)                  m[j-2]=m[j-2]-m[j-1];              else if(c[i]==‘*‘)                  m[j-2]=m[j-2]*m[j-1];              else if(c[i]==‘/‘)                  m[j-2]=m[j-2]/m[j-1];              j--;          }      }      printf("%d\n",m[0]);      return 0;  }  
View Code

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.