棧的應用之求逆波蘭表達式的值

来源:http://www.cnblogs.com/robin-xu/archive/2016/02/28/5224370.html
-Advertisement-
Play Games

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<ctype.h> 4 5 #define OK 1 6 #define ERROR 0 7 #define STACK_INIT_SIZE 20 8 #define STACK_INCREMENT


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<ctype.h>
  4 
  5 #define OK         1
  6 #define ERROR         0
  7 #define STACK_INIT_SIZE 20
  8 #define STACK_INCREMENT 10
  9 #define DIGITBUFFER     10
 10 
 11 typedef int    Status;
 12 typedef double Elemtype;
 13 typedef struct StackNode{
 14     Elemtype* base;
 15     Elemtype* top;
 16     int stackSize;
 17 }StackNode;
 18 typedef struct StackNode* Stack;
 19 
 20 Status InitStack(Stack s){
 21     s->base = (Elemtype*)malloc(sizeof(Elemtype) * STACK_INIT_SIZE);
 22     if(!s->base)
 23         return ERROR;
 24     s->top = s->base;
 25     s->stackSize = STACK_INIT_SIZE;
 26     return OK;
 27 }
 28 Status Pop(Stack s,Elemtype* result){
 29     if(s->base == s->top)
 30         return ERROR;
 31     *result = *(--s->top);
 32     return ERROR;
 33 }
 34 Status Push(Stack s,Elemtype value){
 35     if(s->top - s->base == s->stackSize){
 36         s->base = (Elemtype*)realloc(s->base,sizeof(Elemtype) * (STACK_INIT_SIZE + STACK_INCREMENT));
 37         if(!s->base)
 38             return ERROR;
 39         s->top = s->base + STACK_INIT_SIZE;
 40         s->stackSize = STACK_INIT_SIZE + STACK_INCREMENT;
 41     }
 42     *(s->top) = value;
 43     s->top++;
 44     return OK;
 45 }
 46 int StackLenth(Stack s){
 47     return s->top - s->base;
 48 }
 49 Status RPT(){            //reverse polish notation
 50     char c;
 51     double operater1,operater2;
 52     double result;
 53     int i = 0;
 54     char bufferDigit[DIGITBUFFER];
 55 
 56     Stack s;
 57     InitStack(s);
 58 
 59     printf("  Please Enter Reverse Polish Notation!(RPN)\n");
 60     printf("------note:  separated by space between -------\n");
 61     printf("------     number or operator.end of '#'-------\n");
 62 
 63     scanf("%c", &c);
 64     while(c != '#'){
 65         /* 處理輸入的數字:由於使用%c接受輸入,所以對於123這樣的多位數的
 66          * 輸入%c是不能處理的。所以設置了char型的數組bufferDigit來緩存輸
 67          * 入的多位數。在開始了多位數的輸入之後,必將以空格來結束該多位數
 68          * 輸入,所以if(c == ' ')用來判斷多位數的結束。以便將緩存在char
 69          * 型數組中的多位數轉化為double並且Push。
 70          */
 71         while( isdigit(c) || c == '.'){
 72             if(i == 10){
 73                 printf("number is too lager\n");
 74                 return ERROR;
 75             }
 76             bufferDigit[i++] = c;
 77             bufferDigit[i] = '\0';
 78             scanf("%c", &c);
 79             if(c == ' '){    //不是空格就一定還是數字
 80                 result = atof(bufferDigit);
 81                 Push(s,result);
 82                 i = 0;
 83             }
 84         }
 85         /* 處理輸入的運算符
 86          */
 87         switch(c){
 88             case '+':
 89                 Pop(s,&operater1);
 90                 Pop(s,&operater2);
 91                 Push(s,operater1 + operater2);
 92                 break;
 93             case '-':
 94                 Pop(s,&operater1);
 95                 Pop(s,&operater2);
 96                 Push(s,operater2 - operater1);
 97                 break;
 98             case '*':
 99                 Pop(s,&operater1);
100                 Pop(s,&operater2);
101                 Push(s,operater1 * operater2);
102                 break;
103             case '/':
104                 Pop(s,&operater1);
105                 Pop(s,&operater2);
106                 Push(s,operater2 / operater1);
107                 break;
108         }
109         scanf("%c", &c);
110     }
111 
112     Pop(s,&result);
113     printf("The result of RPN is %f\n",result);
114 }
115 
116 //test;
117 Status ShowStack(Stack s){
118     while(s->base != s->top){
119         printf("%f ",*(--(s->top)));
120     }
121     printf("\n");
122 }
123 Status Test(){
124     Stack s1;
125     InitStack(s1);
126     Push(s1,1);
127     Push(s1,2);
128     Push(s1,3);
129     ShowStack(s1);
130 }
131 int main(){
132     RPT();
133 
134     Stack s;
135     InitStack(s);
136     Push(s,1);
137     Push(s,2);
138     Push(s,3);
139     ShowStack(s);
140     return 0;
141 }
142 /* 該程式編寫的RPT部分功能可以完成,但是Text部分存在不解之處,在程式的124~129行的代碼與134到
143  * 139行的代碼完全相同。但是在main函數中的可以順利運行,而在Test函數中的則出現錯誤(無錯誤提示)
144  * 如果將124~129行的代碼改成如下則可以順利運行:
145     StackNode s1;
146     InitStack(&s1);
147     Push(&s1,1);
148     Push(&s1,2);
149     Push(&s1,3);
150     ShowStack(&s1);
151    不知為何期待大牛指導。
152  * */

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.什麼叫做會話控制 允許伺服器根據客戶端做出的連續請求。 2.為什麼需要會話控制? 因為當你打開一個網站,並想訪問該網站的其他頁面的時候,如果沒有會話控制,當跳轉到其他頁面的 時候,就需要再次輸入賬戶和密碼。 3.Cookie的原理和作用 將客戶端的簡單信息保存在個人PC中,其他程式獲取PC的Co
  • java同步容器 在Java的集合容器框架中,主要有四大類別:List、Set、Queue、Map。List、Set、Queue介面分別繼承了Collection介面,Map本身是一個介面。註意Collection和Map是一個頂層介面,而List、Set、Queue則繼承了Collection介面
  • 1 YUV2RGB的模塊如下: 1 module yuv2rgb( 2 clk, //時鐘輸入 3 rstn, //複位輸入,低電平複位 4 5 y_in, //變換前Y分量輸出 6 cb_in, //變換前Cb分量輸出 7 cr_in, //變換前Cr分量輸出 8 ena_in, //待變換數據使
  • spring沒有採用約定優於配置的策略,spring要求顯示指定搜索哪些路徑下的Java文件。spring將會把合適的java類全部註冊成spring Bean。 問題:spring怎麼知道把哪些Java類當初bean類處理? 這就需要使用annotation,spring使用一些特殊的annota
  • 本文將通過一個 Python 實現的圖片文件批量重命名工具來闡述如何逐步提升程式質量。
  • 學了線程,收穫不少,記錄下了吧. 一、線程的主要兩種實現方法。 1.繼承Thread類,重寫run()方法 main方法中創建子類,引用調用start()方法 實例如下: //繼承Thread類,重寫run()方法 public class ThreadOne extends Thread { pu
  • 《數據結構》第2章第10節歸併擴展的線性鏈表。
  • BlockingQueue簡介 ArrayBlockingQueue:基於數組實現的一個阻塞隊列,在創建ArrayBlockingQueue對象時必須制定容量大小。並且可以指定公平性與非公平性,預設情況下為非公平的,即不保證等待時間最長的隊列最優先能夠訪問隊列。 LinkedBlockingQueu
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...