国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結構 第四章 棧

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結構 第四章 棧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

?? 寫在最前:這篇文章將學習棧這種結構,以及該結構的一些基本操作的實現(xiàn),包括順序存儲棧和鏈式存儲棧的基本操作的實現(xiàn)。
??:點求個關注,讓我們一起探索計算機的奧秘!

一、棧的定義

所謂的棧就是一種特殊的線性表,對于棧這種邏輯結構來說他和線性表最大的區(qū)別就是棧它刪除元素或者添加元素的話只能發(fā)生在表的一端,要么就是表尾部,要么就是表頭。
數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

如上圖所顯示的那樣,這就是棧的結構,當然這是將棧這種邏輯結構使用順序存儲的方式表示出來了。

  • 棧頂:這個特殊的線性表允許插入元素和刪除元素的一端
  • 棧底:是固定的,不允許進行插入和刪除的一端

所以不難發(fā)現(xiàn),由于棧的插入元素和刪除元素操作都只能發(fā)生在線性表的一端,對于這種結構來說,其元素的進出是遵循后進先出
數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構
對于先進入的元素(元素進入稱為進棧),在取出的時候(元素被取出稱為出棧),也會是最先被取出的。

二、棧的基本操作

在定義完一個數(shù)據(jù)的邏輯結構就應該給出相應的基本操作,來操作這個邏輯結構,對于棧這種邏輯結構,是給出了以下幾種常用操作。

  • 初始化操作
  • 判斷棧是否為空
  • 元素進棧
  • 元素出棧
  • 讀棧頂元素,但是不出棧
  • 銷毀棧

三、棧不同的存儲結構的基本操作實現(xiàn)

在學習線性表時,也是學習了線性表這個邏輯結構在順序存儲下的基本操作的實現(xiàn)以及在鏈式存儲下的基本操作的實現(xiàn),所以存儲結構不同,用代碼具體實現(xiàn)這些操作的步驟和思想也是不同的。

①棧的順序存儲

定義好棧的邏輯結構,對于棧這個邏輯結構使用順序存儲,這里使用靜態(tài)數(shù)組來實現(xiàn)順序存儲,定義如下結構。

#define maxsize 100
typedef int Element;

typedef struct {
	Element data[maxsize];    //存放棧元素
	int top;                  //棧頂指針(這里使用靜態(tài)數(shù)組,即使用下標指向棧頂)
}SqStack;

文件結構:

包含三個文件,一個SqStack.h文件用于定義數(shù)據(jù)結構和數(shù)據(jù)結構的基本操作,一個SqStack.cpp文件,該文件用于具體實現(xiàn)這些基本操作,一個test.cpp用于測試實現(xiàn)的函數(shù)是否正確。
數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

初始化操作

SqStack.h的內容

#pragma once
#include<stdio.h>
#include<stdlib.h>

#define maxsize 100
typedef int Element;

typedef struct {
	Element data[maxsize];    //存放棧元素
	int top;                  //棧頂指針(這里使用靜態(tài)數(shù)組,即使用下標指向棧頂)
}SqStack;


// 初始化操作
bool InitStack(SqStack &SqS);

SqStack.cpp的內容

#include"SqStack.h"

// 初始化操作
bool InitStack(SqStack &SqS) {
	SqS.top = -1;         //將棧頂指向-1,為空
	return true;
}

test.cpp的內容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化棧
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

棧的判空操作

SqStack.h的內容

//棧的判空操作
bool IsStackEmpty(SqStack SqS);

SqStack.cpp的內容

// 判斷棧是否為空
bool IsStackEmpty(SqStack SqS)
{
	if (SqS.top == -1) {
		return true;
	}
	else {
		return false;
	}
}

test.cpp的內容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化棧
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//棧判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("棧為空!\n");
	}

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

進棧

SqStack.h的內容

// 元素進棧
bool Push(Element e, SqStack &SqS);

//打印棧
void PrintStack(SqStack SqS);

SqStack.cpp的內容 (這里將打印棧的操作也寫在其中,沒有單獨寫這個打印操作)

// 元素進棧
bool Push(Element e, SqStack& SqS) {
	if (SqS.top == maxsize-1) {
		printf("棧滿,進棧失敗\n");
		return false;
	}
	else {
		SqS.top++;
		SqS.data[SqS.top] = e;
		return true;
	}
}


//打印棧
void PrintStack(SqStack SqS) {
	if (SqS.top == -1) {
		printf("棧為空!");
	}
	else {
		printf("打印順序:棧頂<----棧底\n");
		for (int j = SqS.top; j >= 0; j--) {
			printf("<--%d", SqS.data[j]);
		}
	}
}

test.cpp的內容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化棧
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//棧判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("棧為空!\n");
	}

	//進棧
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);


	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

出棧

SqStack.h的內容

// 元素出棧
Element Pop(SqStack &SqS);

SqStack.cpp的內容

// 元素出棧
Element Pop(SqStack &SqS) {
	if (SqS.top == -1) {
		printf("??諏е鲁鰲Jn");
		exit;
	}
	else {
		Element ele = SqS.data[SqS.top];
		SqS.top--;
		return ele;
	}
}

test.cpp的內容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化棧
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//棧判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("棧為空!\n");
	}

	//進棧
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);
	Element tmp = Pop(SqS1);
	printf("出棧元素為%d\n", tmp);

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

讀棧頂元素

該操作與pop操作的區(qū)別是,這個只是讀出棧頂?shù)脑?,該元素并不出?!?/strong>
SqStack.h的內容

// 讀棧頂元素,但是不出棧
Element GetTop(SqStack SqS);

SqStack.cpp的內容

// 讀棧頂元素,但是不出棧
Element GetTop(SqStack SqS) {
	if (SqS.top == -1) {
		printf("棧頂無元素\n");
		return -1;
	}
	else {
		Element tmp = SqS.data[SqS.top];
		return tmp;
	}
}

test.cpp的內容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化棧
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//棧判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("棧為空!\n");
	}

	//進棧
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);
	Element tmp = Pop(SqS1);
	printf("出棧元素為%d\n", tmp);
	printf("棧頂元素為%d\n", GetTop(SqS1));

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

銷毀棧

這里的銷毀棧,其實只需要將top的值至為-1就行,因為這個棧空間并不是由malloc函數(shù)開辟的,所以不需要free()函數(shù)來回收空間,在程序結束之后,會自動的回收空間。

②棧的鏈式存儲

棧的初始化

SqStack.h的內容

#include<stdlib.h>

typedef int	ElementType;

typedef struct LinkStackNode {
	ElementType data;    //節(jié)點數(shù)據(jù)
	struct LinkStackNode *next;
}LinkStackNode,*LinkStack;

//棧的初始化
int InitStack(LinkStack &LinkS);

SqStack.cpp的內容

#include"LinkStack.h"

//棧的初始化
int InitStack(LinkStack &LinkS) {
	LinkS = (LinkStackNode*)malloc(sizeof(LinkStackNode)); //LinkS--->頭節(jié)點 申請了一個頭節(jié)點
	// printf("%p", LinkS);
	if (LinkS == NULL) {
		printf("空間申請失敗導致初始化失敗\n");
		return -1;
	}
	else {
		LinkS->next = NULL;  //頭節(jié)點的next指向空
		return 1;
	}
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

棧的判空操作

SqStack.h的內容

//棧的判空操作
bool IsStackEmpty(LinkStack Links);

SqStack.cpp的內容

//棧的判空操作
bool IsStackEmpty(LinkStack Links) {
	if (Links->next == NULL) {//頭節(jié)點的next為空,就其頭節(jié)點后無元素
		return true;
	}
	else {
		return false;
	}
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("棧為空\n");
	}

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

進棧

在這一部分將打印棧的操作也寫在這一部分了
SqStack.h的內容

//進棧
bool Push(LinkStack Links, ElementType e);
//打印棧
void PrintStack(LinkStack Links);

SqStack.cpp的內容

//進棧
bool Push(LinkStack Links, ElementType e) {
	LinkStackNode* node = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	if (node == NULL) {
		printf("空間申請失敗導致進棧失敗\n");
		return false;
	}
	else {
		node->next = Links->next;
		Links->next = node;
		node->data = e;
		return true;
	}
}
//打印棧
void PrintStack(LinkStack Links) {
	if (Links == NULL) {
		printf("無效的棧,無法打印\n");
		return;
	}
	if (Links->next == NULL) {
		printf("棧為空!");
		return;
	}
	else {
		printf("打印順序:棧頂<----棧底\n");
		LinkStackNode* tmp = NULL;
		for (tmp = Links->next; tmp != NULL; tmp = tmp->next) {
			printf("<--%d", tmp->data);
			
		}
		printf("\n");
	}
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("棧為空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);

	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

出棧

SqStack.h的內容

//出棧
ElementType Pop(LinkStack Links);

SqStack.cpp的內容


//出棧
ElementType Pop(LinkStack Links) {
	if (Links->next == NULL) {
		printf("棧為空\n");
		return -1;
	}
	else {
		ElementType datatmp = Links->next->data;
		LinkStackNode* tmp = Links->next;
		Links->next = Links->next->next;
		free(tmp);
		return datatmp;
	}
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("棧為空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此時pop的元素為%d\n", Pop(l1));
	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

讀棧頂元素

SqStack.h的內容

//讀棧頂元素
ElementType GetEle(LinkStack Links);

SqStack.cpp的內容

//讀棧頂元素
ElementType GetEle(LinkStack Links) {
	if (Links->next == NULL) {
		printf("此時棧頂為空\n");
		return -1;
	}
	else {
		ElementType tmp = Links->next->data;
		return tmp;
	}
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("棧為空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此時pop的元素為%d\n", Pop(l1));
	printf("此時棧頂?shù)脑貫?d\n", GetEle(l1));
	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構

銷毀棧

SqStack.h的內容

//銷毀棧
void DestoryStack(LinkStack &links);

SqStack.cpp的內容

//銷毀棧
void DestoryStack(LinkStack &links) {
	LinkStackNode* tmp = links->next;
	while (tmp != NULL){
		LinkStackNode* t = tmp;
		tmp = tmp->next;
		free(t);
	}
	free(links); //free掉頭節(jié)點
	links = NULL;
}

test.cpp的內容

#include"LinkStack.h"

int main() {
	LinkStack l1 = NULL;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("棧為空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此時pop的元素為%d\n", Pop(l1));
	printf("此時棧頂?shù)脑貫?d\n", GetEle(l1));
	DestoryStack(l1);
	PrintStack(l1);
	return 0;
}

數(shù)據(jù)結構 第四章 棧,數(shù)據(jù)結構,數(shù)據(jù)結構文章來源地址http://www.zghlxwxcb.cn/news/detail-852097.html

到了這里,關于數(shù)據(jù)結構 第四章 棧的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 第四章 matlab的循環(huán)結構

    第四章 matlab的循環(huán)結構

    循環(huán)(loop)是一種 matlab 結構,它允許我們多次執(zhí)行一系列的語句。循環(huán)結構有兩種 基本形式:while 循環(huán)和 for 循環(huán)。兩者之間的最大不同在于代碼的重復是如何控制的。在 while 循環(huán)中,代碼的重復的次數(shù)是不能確定的,只要滿足用戶定義的條件,重復就進行下 去。相對地,在

    2024年02月06日
    瀏覽(26)
  • 形象談JVM-第四章-JVM內存結構

    形象談JVM-第四章-JVM內存結構

    給我一個CPU,給我一塊內存,我來執(zhí)行一段代碼。 我要如何分配呢? new User(); 這里有一個有一個User類,如果我要new出來User對象,必須先知道它長什么樣子,我先搞一塊區(qū)域出來,把User類的樣子給存下來。 可以把 “User類的樣子” 比作造房子的 “圖紙” 或者 “模板” ;

    2024年02月11日
    瀏覽(19)
  • 第四章 數(shù)據(jù)關聯(lián)分析方法

    第四章 數(shù)據(jù)關聯(lián)分析方法

    基本概念和方法 關聯(lián)規(guī)則和算法應用 基本概念和術語 關聯(lián)規(guī)則算法應用: 一個關聯(lián)規(guī)則分析的例子—————超市購物籃分析 ? ? 不要看 后面數(shù)字看不懂 ? ? ?項集:是指項的集合。包含k個項的項集稱為k-項集 支持度:若A是一個項集,則A的支持度表示在所有事務T中同時

    2024年02月02日
    瀏覽(44)
  • 【考研數(shù)學】線性代數(shù)第四章 —— 線性方程組(1,基本概念 | 基本定理 | 解的結構)

    【考研數(shù)學】線性代數(shù)第四章 —— 線性方程組(1,基本概念 | 基本定理 | 解的結構)

    繼向量的學習后,一鼓作氣,把線性方程組也解決了去。O.O 方程組 稱為 n n n 元齊次線性方程組。 方程組 稱為 n n n 元非齊次線性方程組。 方程組(I)又稱為方程組(II)對應的齊次線性方程組或導出方程組。 方程組(I)和方程組(II)分別稱為齊次線性方程組和非齊次線

    2024年02月11日
    瀏覽(33)
  • 數(shù)據(jù)庫第四章習題_完整版

    數(shù)據(jù)庫第四章習題_完整版

    1.1 請考慮以下 SQL 查詢,該查詢旨在查找 2017 年春季講授的所有課程的標題以及教師的姓名的列表。 請問這個查詢有什么問題? 首先 section 中并沒有我們需要使用到的屬性,所以這里 “natural join setion” 是多余的。 其次,更重要的一點是:在 instructor 關系和 course 關系中都有

    2024年02月07日
    瀏覽(44)
  • 《計算機網絡》第四章 數(shù)據(jù)鏈路控制

    《計算機網絡》第四章 數(shù)據(jù)鏈路控制

    為什么要設計數(shù)據(jù)鏈路層 在原始的物理傳輸線路上傳輸數(shù)據(jù)信號是有差錯的, 存在一定的誤碼率 。 在設計數(shù)據(jù)鏈路層的目的就是如何在有差錯的線路上, 進行無差錯傳輸 。向網絡層提供高質量的服務。 從網絡參考來看,物理層之上各層都有改善 數(shù)據(jù)傳輸質量 的要求,數(shù)

    2024年02月01日
    瀏覽(26)
  • 第四章——數(shù)據(jù)庫的安全性

    第四章——數(shù)據(jù)庫的安全性

    問題的提出:數(shù)據(jù)庫安全性產生的原因 數(shù)據(jù)庫的一大特點是共享性 數(shù)據(jù)共享必然帶來數(shù)據(jù)庫安全性問題 數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)共享不能是無條件的共享 數(shù)據(jù)庫的安全性是指保護數(shù)據(jù)庫以防止不合法的使用所造成的的數(shù)據(jù)泄露、更改或破壞 系統(tǒng)安全保護措施是否有效是數(shù)據(jù)庫

    2023年04月08日
    瀏覽(20)
  • 計算機網絡|第四章:網絡層:數(shù)據(jù)平面

    計算機網絡|第四章:網絡層:數(shù)據(jù)平面

    前文回顧 :第三章:傳輸層 運輸層依賴于網絡層的主機到主機的通信服務,提供各種形式的進程到進程的通信。 網絡層與傳輸層和應用層不同的是, 在網絡中的每一臺主機和路由器中都有一個網絡層部分 。正因如此,網絡層協(xié)議是協(xié)議棧中最具挑戰(zhàn)性的部分。 網絡層分為

    2024年02月12日
    瀏覽(21)
  • 【計算機網絡 - 第四章】網絡層:數(shù)據(jù)平面

    【計算機網絡 - 第四章】網絡層:數(shù)據(jù)平面

    目錄 一、網絡層概述 1、主要作用 2、控制平面方法 3、網絡層提供的兩種服務 二、路由器工作原理 1、路由器總體結構 2、輸入、輸出端口處理 (1)輸入端口 (2)輸出端口 3、交換 (1)經內存交換 (2)經總線交換 (3)經互聯(lián)網絡交換 ?4、排隊問題 (1)輸入排隊、輸出

    2024年02月06日
    瀏覽(34)
  • 第四章 Linux網絡編程 4.1 網絡結構模式 4.2MAC地址、IP地址、端口

    第四章 Linux網絡編程 4.1 網絡結構模式 4.2MAC地址、IP地址、端口

    C/S結構 簡介 服務器 - 客戶機 ,即 Client - Server(C/S)結構。C/S 結構通常采取兩層結構。服務器負責數(shù)據(jù)的管理,客戶機負責完成與用戶的交互任務??蛻魴C是因特網上訪問別人信息的機器,服務器則是提供信息供人訪問的計算機。 客戶機通過局域網與服務器相連,接受用戶

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包