棧在表達式計算過程中的應用

棧在表達式計算過程中的應用 :建立操作數棧和運算符棧。運算符有優先級。
規則
自左至右掃描表達式,凡是遇到操作數一律進操作數棧。
當遇到運算符時,如果它的優先級比運算符棧棧頂元素的優先級高就進棧。反之,取出棧頂運算符和操作數棧棧頂的連續兩個操作數進行運算,并將結果存入操作數棧,然后繼續比較該運算符與棧頂運算符的優先級。
左括號一律進運算符棧,右括號一律不進運算符棧,取出運算符棧頂運算符和操作數棧頂的兩個操作數進行運算,并將結果壓入操作數棧,直到取出左括號為止。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX  100enum link{PUSH, PUSH_NO};typedef struct      // 運算數
{int num[MAX];int top;
}OP_num;typedef struct      // 運算符
{char str[MAX];int top;
}OP_ch;// 運算數置空棧
void SETNULL_num (OP_num* s)        
{s->top = -1;
}// 運算符置空棧
void SETNULL_ch (OP_ch* s)
{s->top = -1;
}// 判斷是否是數字,是返回1 不是返回0
int is_num (char ch)    
{if (ch >= '0' && ch <= '9'){return 1;}else{return 0;}
}       // 數字入棧
int PUSH_num (OP_num *s, int data)
{if ((MAX - 1) == s->top){return 0;}else{   s->num[++s->top] = data;}
}// 運算符入棧
int PUSH_ch (OP_ch* s, char ch)
{if ((MAX - 1) == s->top){return 0;}else{s->str[++s->top] = ch;}
}// 判斷是否將運算符入棧
int jud (OP_ch* s, char ch)
{if (-1 == s->top)   // 判斷是否是空棧{return PUSH;}else{switch (s->str[s->top])     // 根據棧頂運算判斷是否進棧{case '+':           //  當棧頂是'+-'時,只有‘+-)’不進棧case '-':{if (ch == '+' || ch == '-' || ch == ')'){return PUSH_NO;}else{return PUSH;}break;}case '*':case '/':{if ('(' == ch){return PUSH;}else{return PUSH_NO;}break;}case '(':{return PUSH;break;}}}
}// 數字出棧
int Pop_num (OP_num* s)
{return (s->num[s->top--]);
}// 運算符出棧
void Pop_ch (OP_ch* s)
{s->top--;
}// 進行運算
void operate (OP_ch* s_ch, OP_num* s_sum)
{int a = Pop_num(s_sum);                     // 取第一個數int b = Pop_num(s_sum);                     // 取第二個數int result;// 根據當前運算符棧頂的符號來判斷進行何種運算switch (s_ch->str[s_ch->top]){case '+':result = a + b;break;case '-':result = b - a;break;case '*':result = a * b;break;case '/':result = b / a;break;}   PUSH_num (s_sum, result);                   // 將運算結果入棧
}int main()
{OP_num sdata;OP_ch  soper;SETNULL_num (&sdata);SETNULL_ch  (&soper);int i = 0, len_str, t;char str[MAX];char str_num[MAX];          // 存放要轉化的數字gets (str);                 // 輸入表達式len_str = strlen (str);     // 獲取表達式長度while (str[i] != '\0')      // 遍歷表達式{if (is_num(str[i]))     // 判斷是否是數字{t = 0;while (is_num(str[i])){str_num[t++] = str[i++];//將表達式中的數字進行保存,用于轉化為對應的整形數}str_num[t] = '\0';PUSH_num (&sdata, atoi(str_num));// 遇到算數符號的時候讓符號前面的數進棧}else{if (PUSH == jud(&soper, str[i])){PUSH_ch (&soper, str[i]);}else{if (str[i] != ')')      // ')'不讓其入棧所以單獨列出來討論{operate (&soper, &sdata);       // 進行一次運算并一處棧頂運算符Pop_ch(&soper);                 // 符號出棧PUSH_ch (&soper, str[i]);       // 進行壓棧// 相當于用當前的運算符替換了剛才棧頂的運算符號}else                // 遇到')'// 不斷取字符運算 知道遇到 ')'{do{operate (&soper, &sdata);Pop_ch (&soper);}while (soper.str[soper.top] != '(');Pop_ch (&soper);// 將‘(’彈出棧空間}}i++;}}while (soper.top != -1){operate (&soper, &sdata);Pop_ch (&soper);}printf ("%d\n", sdata.num[sdata.top]);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448520.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-02-基礎知識

一、第一個Python程序 【第一步】新建一個hello.txt 【第二步】將后綴名txt改為py 【第三步】使用記事本編輯該文件 【第四步】在cmd中運行該文件 print("Hello World!") 強調&#xff1a;python解釋器執行程序是解釋執行&#xff0c;即打開文件讀內容&#xff0c;因…

數據結構之樹的一些基本操作

樹是由根結點和若干顆子樹構成的。樹是由一個集合以及在該集合上定義的一種關系構成的。集合中的元素稱為樹的結點&#xff0c;所定義的關系稱為父子關系。父子關系在樹的結點之間建立了一個層次結構。在這種層次結構中有一個結點具有特殊的地位&#xff0c;這個結點稱為該樹的…

利用FS寄存器獲取KERNEL32.DLL基址算法的證明(ZZ)

轉自&#xff1a;http://blog.csdn.net/int2e/archive/2008/01/09/2032732.aspxFS寄存器指向當前活動線程的TEB結構&#xff08;線程結構&#xff09; 偏移 說明 000 指向SEH鏈指針 004 線程堆棧頂部 008 線程堆棧底部 00C SubSystemTib 010 FiberData 014 ArbitraryUse…

很老很老的老偏方,小病一掃光

1、洋蔥、生姜治頭皮屑 ①將一個的洋蔥頭用紗布包好&#xff0c;用它揉擦頭皮&#xff0c;24小時后用溫水洗頭&#xff0c;即可止頭癢&#xff0c;除頭皮屑。 ②先將生姜切片&#xff0c;放入鍋里煮沸&#xff0c;待水溫不燙的時候倒上適量醋&#xff0c;加水洗頭。 2、小白果…

script 放置最佳位置以及 html 執行順序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 看到知乎上有很多討論關于javascript位置的文章。所以特意留意了這方面的問題。 首先要了解到的是&#xff1a; html文件是自上而下的執…

677A

#include <stdio.h> int main() {int n, h;scanf("%d%d", &n, &h);int temp, width0;int i;for(i0; i<n; i){scanf("%d", &temp);if(temp<h)width;elsewidth2;}printf("%d\n", width);return 0; }轉載于:https://www.cn…

數據結構之二叉樹的一些基本操作

二叉樹是樹的特殊一種&#xff0c;具有如下特點&#xff1a;1、每個結點最多有兩顆子樹&#xff0c;結點的度最大為2。2、左子樹和右子樹是有順序的&#xff0c;次序不能顛倒。3、即使某結點只有一個子樹&#xff0c;也要區分左右子樹。 頭文件 BTree.h #ifndef __BTREE_H__ …

【Arduino】使用C#實現Arduino與電腦進行串行通訊

在給Arduino編程的時候&#xff0c;因為沒有調試工具&#xff0c;經常要通過使用串口通訊的方式調用Serial.print和Serial.println輸出Arduino運行過程中的相關信息&#xff0c;然后在電腦上用Arduino IDE的Serial Monitor來查看print出來的信息。Serial Monitor不僅可以接受Ar…

虛擬機NAT模式聯網

阿里開源鏡像軟件&#xff1a;https://opsx.alibaba.com/mirror 如何使VMware ip與本機ip處于同一網段 https://blog.csdn.net/kakuma_chen/article/details/71425620 轉載于:https://www.cnblogs.com/cdy0626/p/11131440.html

VS2008下最新X264(svn 2009.9)編譯不過的解決辦法

總有人說最新的版本 編譯不過&#xff0c;搞的群、 論壇里到處都是這種求助貼。建議斑竹把這個解決辦法放到醒目的位置&#xff0c;以減少噪音。科普開始1、編譯問題由于MS的VS編譯器對C99標準支持不好&#xff0c;不支持函數當中混合定義、聲明變量。解決辦法&#xff1a;在函…

node、npm、vue安裝 -- VUE 項目 demo 實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 安裝node&#xff1a; sudo yum install epel-release sudo yum install nodejs node --version // 安裝好后查看版本2. 安裝 npm …

用C語言實現簡單的停車場管理

這個程序是利用棧和循環隊列實現的&#xff0c;自己得先處理好邏輯關系就好了。由于題目沒有要求&#xff0c;這個程序就沒加重復判斷&#xff0c;比如一輛車已經停在車位上或者便道上&#xff0c;再來一輛就判斷不了了。關于棧&#xff0c;就是先進后出的思想&#xff0c;隊列…

推薦一個配置linux服務的網站

該網站的各種linux服務的配置都是基于CentOS系統的 基本上各種linux服務都有了 http://www.server-world.info/en/轉載于:https://www.cnblogs.com/Skyar/p/3582389.html

mariadb數據庫增刪改查

1.常用數據類型 1&#xff09;整數:int, bit 2&#xff09;小數:decimal    #decimal(5,2)表示共有五位數&#xff0c;保留兩位小數 3&#xff09;字符串:varchar, char   4&#xff09;日期時間:date, time, datetime 5&#xff09;枚舉類型(enu…

為什么你工作努力卻沒有起色?

成為職場達人&#xff0c;未必要經常挑燈夜戰。相反&#xff0c;注意到下面幾條&#xff0c;會讓你少走彎路。 1&#xff09;成長的機會永遠比眼前的待遇重要——做重要的事比多拿錢重要。 我知道在水木bbs上的worklife版本&#xff0c;每天都在上演的就是比較自己的第一個o…

《 Spring 實戰 》(第4版) 讀書筆記 (未完結,更新中...)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Pxx 表示在書的第 xx 頁。 Spring 框架的核心是 Spring 容器。 1. (P7.) 構造器注入是依賴注入的方式之一。 緊耦合&#xff1a;在 …

數據結構排序法之希爾排序法(Shell Sort)

希爾排序&#xff0c;也叫遞減增量排序&#xff0c;是插入排序的一種更高效的改進版本。希爾排序是不穩定的排序算法。 希爾排序是基于插入排序的以下兩點性質而提出改進方法的&#xff1a; 1、插入排序在對幾乎已經排好序的數據操作時&#xff0c;效率高&#xff0c;即可以達…

Windows To Ghost系統封裝之必備軟件集 - 好壓

好壓壓縮軟件&#xff08;HaoZip&#xff09;是強大的壓縮文件管理器&#xff0c;是完全免費的新一代壓縮軟件&#xff0c;相比其它壓縮軟件系統資源占用更少&#xff0c;有更好的兼容性&#xff0c;壓縮率比較高。 它提供了對ZIP、7Z和TAR文件的完整支持&#xff0c;能解壓RAR…

js 彈窗并定時關閉

1. $(input).click(function() {prompt(點擊成功, 2000) })function prompt(newName, time, fn) {var $div $(<div></div>);$div.css({position: fixed,top: 0,left: 0,width: 100%,height: 100%,z-index: 200,background-color: rgba(0,0,0,0.4),// background-c…

數據結構排序法之插入法

插入排序是一種簡單直觀的排序算法。它的工作原理非常類似于我們抓撲克牌。 對于未排序數據(右手抓到的牌)&#xff0c;在已排序序列(左手已經排好序的手牌)中從后向前掃描&#xff0c;找到相應位置并插入。 插入排序在實現上&#xff0c;通常采用in-place排序&#xff08;即…