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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...