棧的順序儲存及實現(一)
繼續學習資料結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那註定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這麼牛逼麼,一本書直接都從入門到精通了,只不是吸引那些初學者的鰲頭吧了。演算法都是老前輩們留下來解決某一類問題非常行之有效的方法,不管什麼時候都不會過時。雖然很多演算法,在很多書上或者網上都有,但是我們得自己去敲一遍,才能有所收穫。
不扯了,首先我們來看一下棧的相關定義。
棧(stack)是限定僅在表尾進行插入和刪除操作的線性表。
我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又被稱為後進先出(LastIn First Out)的線性表,簡稱LIOF結構。
首先它是一個線性表,也就是說,棧元素具有線性關係,即前驅後繼關係。只不過它是一種特殊的線性表而已。
它的特殊之出在於限制了這個線性表的插入和刪除位置,它始終只在棧頂進行。這使得:棧底是固定的,最先進棧的只能在棧底。
棧的插入叫 進棧也稱 壓棧、入棧。
棧的刪除叫出棧,也稱彈棧。
當然 壓棧和出棧是棧最重要的演算法。
實際上棧在程式中用的是特別多的,比如瀏覽器的前進後退,文件的撤銷操作等都是用的棧的方式。
接下來我們用陣列也就是順序儲存結構來實現棧的相關演算法。下面是我們棧的資料結構
typedef struct SeqStack {
EleType data[MAXSIZE];//儲存棧資料
int top;//棧頂位置
}SeqStack;
進棧操作:
棧未滿的情況下,插入元素為新的棧頂,棧頂指標相應加1。出棧操作:
若棧不為空,則刪除stack的棧頂元素,棧頂減一,返回刪除元素值。
當為棧空時 top=-1。
下面通過程式碼來實現棧的相關演算法實現。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <math.h> #include <math.h> #include <stdlib.h> #define MAXSIZE 100 #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int EleType; //順序儲存結構的棧的資料結構 typedef struct SeqStack { EleType data[MAXSIZE];//儲存棧資料 int top;//棧頂位置 }SeqStack; /* 初始化連結串列,直接將棧頂置為-1,就代表,棧內所有位置可用。 */ int initStack(SeqStack* stack) { if (NULL == stack) { return ERROR; } stack->top = -1; return OK ; } /* 壓棧,很簡單,在空間允許情況下往棧頂上面一個位置進行壓入元素 */ int push(SeqStack * stack, EleType e) { if (NULL == stack || MAXSIZE == stack->top + 1) { return ERROR; } stack->data[stack->top + 1] = e; stack->top++; return OK; } /* 彈棧,一樣的道理,在非空棧中彈出元素,通過指標將元素值進行返回。 */ void pop(SeqStack* stack, EleType* e) { if (NULL == stack || NULL == e || stack->top == -1) { return ERROR; } *e = stack->data[stack->top]; stack->top--; return OK; } /* 從棧頂向下展示元素值 */ void showStack(SeqStack* stack) { if (NULL == stack||stack->top==-1) { return; } int i = stack->top; for (; i >=0; i--) { printf("%d\n", stack->data[i]); } return; } /* 清空棧 */ int clearStack(SeqStack* stack) { if (NULL == stack) { return ERROR; } stack->top = -1; return OK; } /* 判斷棧是否為空 */ int stackEmpty(SeqStack* stack) { if (NULL == stack) { return ERROR; } if (stack->top == -1) { return TRUE; } return FALSE; } int getTop(SeqStack* stack,EleType *e) { if (NULL == stack) { return ERROR; } *e = stack->data[stack->top]; return OK; } /* 棧元素個數 */ int getStackLength(SeqStack* stack) { if (NULL == stack) { return ERROR; } return stack->top + 1; } int main(int argc, char *argv[]) { SeqStack stack;//建立順序棧 initStack(&stack);//初始化 push(&stack, 5); push(&stack, 4); push(&stack, 3); push(&stack, 2); push(&stack, 1); printf("壓入元素個數%d\n", getStackLength(&stack)); puts("分別為:"); showStack(&stack); puts("彈出2個元素後:"); EleType e1,e2; pop(&stack, &e1); pop(&stack, &e2); showStack(&stack); printf("彈出元素為:%d,%d\n", e1, e2); return 0; }
棧的相關演算法,還是比較容易理解的。
驗證結果截圖:
相關推薦
棧的順序儲存及實現(一)
繼續學習資料結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那註定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這麼牛逼麼,一本書直接都從入門到精通了,只不是
第34課 棧的概念及實現(上)
操作符 cap ons 順序存儲 異常安全 city const text cte 1. 棧的概念 (1)棧是一種特殊的線性表 (2)棧僅能在線性表的一端進行操作 ①棧頂(Top):允許操作的一端 ②棧底(Bottom):不允許操作的一端 (3)棧的特性——後進先出
實現自定義查詢的數據庫設計及實現(一)
bre 名稱 審批流程 work 數據庫名 需要 自定義查詢 perm 枚舉 需求 先說一下需求:實現用戶自定義的查詢,用戶可以自定義要查詢的列、自定義條件條件、自定義排序。除了查詢使用外,還可以使用於各個需要根據條件進行約束的業務,如權限; 本設計和實現,很大部分是通過數
KVM虛擬化的四種簡單網絡模型介紹及實現(一)
_for only 應該 code eth tun x86_64 信息 dock KVM中的四種簡單網絡模型,分別如下:1、隔離模型:虛擬機之間組建網絡,該模式無法與宿主機通信,無法與其他網絡通信,相當於虛擬機只是連接到一臺交換機上。2、路由模型:相當於虛擬機連接到一臺路由
HTTP 代理原理及實現(一)
文章目錄 普通代理 隧道代理 提醒:本文最後更新於 1097 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 Web 代理是一種存在於網路中間的實體,提供各式各樣的功能。現代網路系統中,Web 代理無處不在。我之前有關 HTTP 的博文中,多次提到了代理對 HTTP 請
寫程式學ML:樸素貝葉斯演算法原理及實現(一)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、樸素貝葉斯演算法的原理 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。 和決策樹模型相比,樸素貝葉斯
寫程式學ML:Logistic迴歸演算法原理及實現(一)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、Logistic迴歸演算法的原理 假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個
c語言:順序表的實現(一) 建立,插入,刪除,查詢,輸出等基本操作實現
#include<iostream> #include<stdio.h> #define LIST_INIT_SIZE 100 #define LIST_INCREMENT 10 using namespace std; struct Sqlist{
計算機網路(七)--TCP的可靠傳輸原理及實現(一)
可靠傳輸的工作原理 TCP傳送的報文段是交給IP層傳送的。但IP層只能提供盡最大努力服務。所以TCP必須採用適當的措施才能使兩個運輸層之間的通訊變得可靠。 理想的傳輸條件: (1)傳輸通道不產生差錯。 (2)不管傳送方以多快的速度傳送資料,接收方總是來得及處理收到的資料。
每天一個數據結構----佇列的順序儲存結構實現(純程式碼)
// // main.c // Queue 迴圈佇列 // // // Created by Jacobs.Guo on 2018/5/7. // Copyright © 2018年 yage guo. All rights reser
分頁技術原理與實現之分頁的意義及方法(一)
轉載自https://www.jb51.net/article/86326.htm。 什麼是分頁技術 分頁,是一種將所有資料分段展示給使用者的技術.使用者每次看到的不是全部資料,而是其中的一部分,如果在其中沒有找到自習自己想要的內容,使用者可以通過制定頁碼或是翻頁的方式轉換可見內容,
spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一)
SpringBootMonitor spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一) spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二) spring-boot-ad
有限元一維變頻寬儲存的剛度方程的LDLT求解用C++實現(一)
在有限元程式中,剛度方程[K]建立完畢,節點力向量F經過了非齊次邊界條件處理、等效節點力處理後,都搞成了已知量。此時,就可以解F=KD方程組,來求節點位移向量D了。 求解F=KD方程組的方法有很多,主要可以分為精確解法和迭代解法兩種。顧名思義,精確解法就是直接解出D向量的精
基於以太坊的DPOS實現(一)原始碼及測試執行
原始碼 目錄 測試執行 安裝環境 開始之前請先確認已經安裝配置好Go語言環境,安裝包可以從https://golang.org下載,如果連不Go的官網請自行百度下安裝包。gttc現在支援Go版本為 1.9.x、1.10.x 及1.11.x。 $ go ver
影象處理基礎及OpenCV實現(一)
最近學習數字影象處理基礎及OpenCV實現這本書,寫一點東西記錄所學的內容。。 一、 開啟影象與視訊 開啟影象 用到了OpenCV中的結構體IplImage, 函式IplImage* cvLoadImage( const char* filename, int
棧和佇列面試題(一)---一個數組實現兩個棧
一,用一個數組實現兩個棧(先進後出),有以下幾種方法: ①陣列的奇數位置儲存一個棧的元素,偶數位置儲存另一個棧的元素; ②兩個棧分別從陣列的中間向兩頭增長; 陣列的中間位置看做兩個棧的棧底,壓棧時棧頂指標分別向兩邊移動,當任何一邊到達陣列的起始位置或是陣
VC++對話方塊程式列印及列印預覽的實現(一)
張明奇(卡哥)註釋:成功版本 MFC文件/檢視的應用程式,嚮導給了列印及列印預覽的標準支援。使這類應用程式列印及列印預覽工作得以簡化。另一類對話方塊程式卻沒有相應支援,從MFC列印及列印預覽的標準支援
資料分析基本技巧及python實現(一)
該文總結資料分析常用手法,在程式碼中用註釋的形式給出必要的闡述。 需要安裝包:numpy、scipy、numpy、pandas、sklearn 檢查資料是否符合某項分佈 檢查資料是否符合正態分佈 #檢查資料是否符合正態分佈 ##構建正態分佈資料 In [1]: impor
UNIX管道應用及Shell實現(一)-主體框架
作業系統的第一個大作業是做一個簡單的Shell,實現重定向、管道等功能。奮戰了好幾天終於基本搞定了= = 基本要求 Shell能夠解析的命令列法如下: 帶引數的程式執行功能。 program arg1 arg2 … argN 重
tomcat原理及安裝及反向代理、會話保持、session叢集和session共享伺服器的實現(一)
JDK(java development kit)叫做java開發工具包,是整個java的核心,包括JRE(java runtime environment,叫做java執行是環境),一堆java的工具和java的基本類庫。 JDK包含的元件包括: java