資料結構——c語言描述 第三章 (2)棧的練習(四則運算的實現)
棧的基本概念和實現我在上一篇文章中實現了,現在做一下練習,一個簡單的四則運算的實現,還是比較簡單的,我並沒有再往下實現括號的四則運算,這個都是次要的,主要是掌握棧的操作方法,和一些基本的注意事項,其實這個程式碼我之前刪除了又重寫了一邊,第一遍在實現的過程中對自己的程式碼並沒有感到滿意。在這個練習的過程中自己還是學到了很多的細節上的問題,有些東西只有自己動手去做才會明白其中的重要的部分。多多實踐才是提高的方法,部落格就是監督自己的手段之一。
下面上程式碼:
主要思路上,先對輸入的字串(以字元'#'結尾)進行掃描,將掃描到的符號和數字都分別放到陣列當中,再進行進棧,出棧操作,判斷優先順序,將乘號和除號先進行運算,運算完的值再進行進棧操作就可以了。這個就不進行很詳細的註釋了。哈哈我真懶XD!#include <stdio.h> #include "seqstack.h" #include <string.h> #include <stdlib.h> #define BUF_SIZE 1024 SeqStack stack_number; SeqStack stack_char; long char_to_long (char *c , int count) ; int is_vaild (char *buf , int count) ; long search_buf (char * buf , int count) ; long count_res (long m , long n , char op) ; int main () { int count = 0; char c; char buf[BUF_SIZE]; long res; init_stack (&stack_char); init_stack (&stack_number); while ((c = getchar()) != '#') { if (count == BUF_SIZE - 1) { printf ("the buf is full\n"); break; } else { buf[count] = c; count++; } } if (!is_vaild (buf , count)) { printf ("the input string error\n"); return 1; } res = search_buf(buf , count); printf ("the res is %ld\n" , res); } long search_buf (char *buf , int count) { char *point_arr[BUF_SIZE]; int i , point_count; char temp; long op; long s , t ; char op_arr[BUF_SIZE]; int op_count = 0; long data_arr[BUF_SIZE]; int data_count = 0; int length; long res; point_arr[0] = buf-1; point_count = 1; for (i = 0 ; i < count ; i++) { temp = *(buf+i); if (temp == '*' || temp == '\\' || temp == '+' || temp == '-') { point_arr[point_count] = buf+i; point_count++; } } point_arr[point_count] = buf+count; point_count++; for (i = 0 ; i < point_count - 2 ; i++) { op_arr[op_count] = *point_arr[i+1]; op_count++; } for (i = 0 ; i < point_count - 1 ; i++) { length = point_arr[i+1] - (point_arr[i]+1); data_arr[data_count] = char_to_long(point_arr[i]+1 , length); data_count++; } //above all the search is ok push (&stack_number , data_arr[0]); for (i = 0 ; i < op_count ; i++) { if (op_arr[i] == '+' || op_arr[i] == '-') { push (&stack_char , (long)op_arr[i]); push (&stack_number , data_arr[i+1]); }else if (op_arr[i] == '*' || op_arr[i] == '\\') { pop (&stack_number , &s); t = count_res (s , data_arr[i+1] , op_arr[i]); push (&stack_number , t); } } pop (&stack_number , &res); while (!is_empty (&stack_char)) { pop (&stack_char , &op); pop (&stack_number , &s); res = count_res (s , res , (char)op); } return res; } int is_vaild (char *buf , int count) { int i; char temp; int flag = 1; for (i = 0 ; i < count ; i++) { temp = *(buf+i); if ((temp >='0' && temp <='9') || temp == '+' || temp == '-' || temp == '*' || temp == '\\') continue; else { flag = 0; break; } } return flag; } long char_to_long (char *c , int count) { int i; long res = 0; int temp; for (i = 0 ; i < count ; i++) { if (*(c+i) > '9' || *(c+i) < '0') { printf ("the input seq error\n"); return -1; } temp = *(c+i) - '0'; res *= 10; res += temp; } return res; } long count_res (long m , long n , char op) { long temp; switch (op) { case '+': return m+n; case '-': return m-n; case '*': return m*n; case '\\': return (m/n); default: return -1; } }
相關推薦
資料結構——c語言描述 第三章 (2)棧的練習(四則運算的實現)
棧的基本概念和實現我在上一篇文章中實現了,現在做一下練習,一個簡單的四則運算的實現,還是比較簡單的,我並沒有再往下實現括號的四則運算,這個都是次要的,主要是掌握棧的操作方法,和一些基本的注意事項,其實這個程式碼我之前刪除了又重寫了一邊,第一遍在實現的過程中對自己的程式碼並沒
資料結構——c語言描述 第五章(3)十字連結串列儲存稀疏矩陣
這段時間在看c++primer,深切的體會到了c++是多麼複雜的一門語言,但是在c++中又包含著c語言所不擁有的很多特性,不說那麼多了,等我囫圇吞棗地把它看完我應該要開始更新c++的部落格了,當然這本書我是會更新完的,哈哈。 第五章的最後一個內容,用十字連結串列儲存係數矩陣
資料結構( Pyhon 語言描述 ) — —第9章:列表
概念 列表是一個線性的集合,允許使用者在任意位置插入、刪除、訪問和替換元素 使用列表 基於索引的操作 基本操作
【C語言】第三章-函式-2
第2節 函式呼叫 函式呼叫一般有兩種方式,一種是形參不會影響實參的傳值呼叫,另一種是形參會影響實參的傳址呼叫。 傳值呼叫 傳值呼叫是將實參的值傳入函式體中,傳入的不過是實參的副本,不會改變實參。這個在上一節已經講過其中的原因正式因為C語言副本傳參的這個特
[轉載]演算法精解(C語言描述) 第3章 讀書筆記
第3章 遞迴 1、基本遞迴 假設想計算整數n的階乘,比如4!=4×3×2×1。 迭代法:迴圈遍歷其中的每一個數,然後與它之前的數相乘作為結果再參與下一次計算。可正式定義為:n! = (n)(n-1)(n-2)…(1)。 遞迴法:將n!定義為更小的階乘形式。可以正式定義為:
《資料結構 C++ 語言描述》電子書下載 -(百度網盤 高清版PDF格式)
作者:William Ford,William Topp 【譯者】 劉衛東 沉官林 出版日期:1999-9-1 出版社:清華出版社 頁數:708 ISBN:7-302-03160-6 檔案格式:PDF 檔案
JAVA資料結構和演算法:第三章(棧和佇列)
棧 棧是限制僅在一個位置上進行插入和刪除的線性表。允許插入和刪除的一端為末端,稱為棧頂。另一端稱為棧底。不含任何資料元素的棧稱為空棧。棧又成為後進先出(LIFO)表,後進入的元素最先出來。 首先,棧是一個線性表,元素之間具有線性關係,即前驅後繼關係,其次,
資料結構與演算法分析——第三章 表、棧和佇列1
3.1 抽象資料型別 抽象資料型別(ADT):一些操作的集合 理解:數學的抽象;模組化設計;沒有實際的資料,只是一種結構,一種對於資料儲存的思想。 3.2 表ADT 定義:空表、後繼、前驅 操作:PrintList、MakeEmpty、Find、Fin
C語言程式設計第三章習題三
3.1 (1)(float)(a*b)/2)=18.000000 (int)%(int)y=2 (2)P=32 q=80 x=33 y=80 3.2 1#include<stdio.h> 2main() 3{ 4 intx=123,a,b,c,su
資料結構C語言描述———用順序佇列判斷迴文數
所謂迴文數就是正著讀跟倒著讀一樣,比如abcba。用佇列判斷迴文數需要一個棧作為中間量,把一串數字分別進棧和入隊,按照棧先進後出和佇列先進先出的原則,如果棧頂元素跟隊頭元素相等,則棧頂元素出棧同時隊頭元素出隊,接著往下比較,知道必到該串數字的長度的一半,如果之前出棧的元素和
資料結構 C語言 嚴蔚敏版 演算法2.1
//已知線性表La和Lb的資料元素按值非遞減有序排列,現要求將La和Lb歸併為一個新的線性表Lc,且Lc中的資料元素仍按值非遞減有序排列。 #include <stdio.h> #include <stdlib.h> #include <ma
資料結構--C語言--逆序建立單鏈表,遍歷單鏈表,在單鏈表第5個元素前插入一個值為999的元素,刪除單鏈表第5個元素
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define LEN sizeof(struct LNode) struct LNode{ int data; struct LNode
資料結構C語言版(第二章迷宮)
轉自未空blog //我剛開始對STACK的記憶體分配那有點問題,後來用這個程式碼除錯了下,感覺有點明白了, 地址由高到低分配,然後程式碼中的base和top剛開始指向地址最低的地方,記憶體不夠時重新在原有基礎上新增記憶體,top指向原有的棧頂,然後繼續
Java程式語言基礎第三章 選擇結構
一.if選擇結構 1.什麼是if選擇結構:if選擇結構就是根據條件判斷後在做處理。 二.if選擇結構有哪些: 1.基本的if選擇結構 2.if-else選擇結構 3.多重if選擇結構 4.巢狀選擇結構 課後作用總結: 一.買彩票 如果體彩中了500萬,我買車、資
《資料結構(C語言版)》嚴蔚敏---第一章緒論
資料結構 資料結構主要研究非數值計算問題,資料結構是一門研究非數值計算程式設計中的操作物件,以及這些物件之間關係和操作的學科。 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。 資料結構包括邏輯結構和儲存結構兩個層次。 邏輯結構的四種基本關係: 集合結構 線性結構 樹結構 圖
讀書筆記之《Go程式設計語言》---第三章 基本資料
基本資料 基礎型別:數值型別、字串、布林 集合型別:陣列、結構體 引用型別:指標、slice、map、函式、通道 介面型別:第七章討論 整數 go數值型別包含了幾種不同大小的整數、浮點數和複數 宣告:var name int 知識點: 有符
資料結構第三章實驗2.實現鏈棧的各種基本運算
(1)初始化棧s。 (2)判斷棧s是否為空。 (3)依次進棧元素a,b,c,d,e。 (4)判斷棧s是否為空。 (5)輸出出棧序列。 (6)判斷棧s是否為空。 (7)釋放棧。 #include <stdio.h> #include &l
C#認證考試第三章
pac png strip form ips pub 選擇 背景 第三章 ps:因為前面請假,沒能在規定時間做出總結,現在補上 如果你看了第三章的內容,你會發現第三章在著重跟我們講解對Windows窗體的設計,其中包括窗體背景、前景色、字體顏色、位
數據結構復習【第三章】 棧
del 一次 3.2 alt 技術分享 求值 == 字符 image (1)掌握棧的相關概念、特點和基本操作(入棧、出棧、判棧空、獲取棧元素等)。 棧:限制只能在表的一端進行插入和刪除的線性表。 允許插入和刪除的一端,稱為棧頂(top)。 不允許插入和刪除的另一端,稱為棧底
C Primer Plus 第三章 編程練習
思考 reat enter span n) 試驗 val unsigned 小數 1.通過試驗(即編寫帶有此類問題的程序)觀察系統如何處理整數上溢、浮點數上溢和浮點數下溢的情況。 #include<stdio.h> int main(void) {