1. 程式人生 > >棧的順序儲存及實現(一)

棧的順序儲存及實現(一)

繼續學習資料結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那註定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這麼牛逼麼,一本書直接都從入門到精通了,只不是吸引那些初學者的鰲頭吧了。演算法都是老前輩們留下來解決某一類問題非常行之有效的方法,不管什麼時候都不會過時。雖然很多演算法,在很多書上或者網上都有,但是我們得自己去敲一遍,才能有所收穫。

不扯了,首先我們來看一下棧的相關定義。

棧(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