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

棧的概念及其基本操作--詳細(xì)(C++)

這篇具有很好參考價(jià)值的文章主要介紹了棧的概念及其基本操作--詳細(xì)(C++)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

基本概念及相關(guān)術(shù)語:

棧是只允許在一端進(jìn)行插入和刪除操作的線性表。

由此可見,棧也是線性表的一種,只是棧的操作受限制的線性表。

棧頂(top):線性表允許插入和刪除的那一段。值得注意的是,棧頂指針top的指向是有些兩種方式的,一種是指向棧頂當(dāng)前元素,一種是指向棧頂?shù)南乱晃恢?。兩種指向方式對棧的操作影響不大,只是在判斷棧頂位置的時(shí)候略有差異,本文以指向當(dāng)前棧頂元素為例。另一種指向方式讀者可以自行實(shí)踐。

棧底(bottom):固定的,不允許進(jìn)行插入和刪除的另一端。

空棧:不含有任何元素的空表。

c++棧的基本操作,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,數(shù)據(jù)結(jié)構(gòu)

棧的存儲方式:

棧有兩種基本存儲方式:

  1. 順序存儲:利用一段連續(xù)的內(nèi)存空間進(jìn)行存儲。
  2. 鏈?zhǔn)酱鎯Γ豪梅沁B續(xù)的內(nèi)存空間存儲,元素之間使用指針進(jìn)行鏈接。(通常單鏈表實(shí)現(xiàn),棧頂是表頭,棧底的表尾)

鏈棧的優(yōu)點(diǎn):

  • 便于多個(gè)棧共享存儲空間,提高空間效率;
  • 不存在棧滿上溢的情況

棧的特性:

先進(jìn)后出

棧的基本操作--順序存儲

棧的基本操作大致包括6個(gè):

  1. InitStack(&s):初始化一個(gè)空棧;
  2. StackEmpty(s):判斷一個(gè)在棧是否為空;
  3. Push(&s,x):入棧,若棧S未滿,這將x加入棧,使之稱為棧頂;
  4. Pop(&s):出棧,若棧S非空,則彈出棧頂元素;
  5. GetTop(s,x):讀棧頂元素;
  6. DestroyStack(&s):銷毀棧,釋放棧S所占用內(nèi)存空間;

1.InitStack(&s):初始化一個(gè)空棧:

創(chuàng)建一個(gè)空棧后,將棧頂指針指向-1;

void stackinit(sq& s)
{
	s.top = -1;
}

2.StackEmpty(s):判斷一個(gè)在棧是否為空:

bool stackempty(sq s)
{
	if (s.top == -1) return true; //為空返回true
	else return false; //不為空返回false
}

3.Push(&s,x):入棧,若棧S未滿,這將x加入棧,使之稱為棧頂:

bool push(sq& s, int x)
{
	if (s.top == maxsize - 1) return false; //如果??臻g滿,則不能再插入元素,否則導(dǎo)致內(nèi)存溢出,直接返回false;
	s.data[++s.top] = x; //棧不滿,則可以插入元素,將棧頂指針上移,再將需要插入的元素賦值給棧頂
	return true;
}

4.Pop(&s):出棧,若棧S非空,則彈出棧頂元素:

void pop(sq& s)
{
	if (s.top == -1) cout << "???<<endl; //棧為空,則不能出棧。
	s.top--; //棧不空,能出棧,棧頂指針下移
}

5.GetTop(s,x):讀棧頂元素:

int gettop(sq s)
{
	int x; //接收棧頂元素 
	if (s.top == -1) return -1; //??眨瑹o法讀取元素
	x = s.data[s.top]; //棧不空,將當(dāng)前棧頂元素賦值給x
	return x; //返回x的值,即讀取x的值
}

6.DestroyStack(&s):銷毀棧,釋放棧S所占用內(nèi)存空間:

void destorystack(sq &s) {
	if (s.top!=-1) free(s.data); //若棧不空,釋放棧所占用的內(nèi)存空間
	s.top = -1;
}

整體代碼:

#include<iostream>
using namespace std;
#define maxsize 10
typedef struct {
	int data[maxsize];
	int top;
}sq;
void stackinit(sq& s)
{
	s.top = -1;
}
bool stackempty(sq s)
{
	if (s.top == -1) return true;
	else return false;
}
bool push(sq& s, int x)
{
	if (s.top == maxsize - 1) return false;
	s.data[++s.top] = x;
	return true;
}
void pop(sq& s)
{
	if (s.top == -1) cout << "???<<endl;
	s.top--;
}
int gettop(sq s)
{
	int x;
	if (s.top == -1) return -1;
	x = s.data[s.top];
	return x;
}
void destorystack(sq &s) {
	if (s.top!=-1) free(s.data);
	s.top = -1;
}
int main() {
	sq s1;
	stackinit(s1);
	for (int i = 0; i < 10; i++)
	{
		push(s1, i);
	}
	while (!stackempty(s1))
	{
		cout << gettop(s1)<< " ";
		s1.top--;
	}	
	cout << endl;
	for (int i = 0; i < 10; i++)
	{
		push(s1, i);
	}
	pop(s1);
	while (!stackempty(s1))
	{
		cout << gettop(s1) << " ";
		s1.top--;
	}
	destorystack(s1);
	return 0;
}

執(zhí)行結(jié)果:

c++棧的基本操作,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,數(shù)據(jù)結(jié)構(gòu)

鏈表的基本操作--鏈?zhǔn)酱鎯?/span>

鏈?zhǔn)酱鎯褪菍︽湵淼牟僮?,在這里可以設(shè)置頭節(jié)點(diǎn)也可以不設(shè)置頭節(jié)點(diǎn)。

我這里以單鏈表有頭結(jié)點(diǎn)的頭插法為例。

鏈棧的節(jié)點(diǎn)定義:

typedef struct Linknode {
	int data;
	struct Linknode* next;
};

1.InitStack(*head):初始化一個(gè)空棧:

void initlink(Linknode *head) {
	if (head == nullptr) cout << "分配失敗" << endl;
	else head->next = nullptr;
}

2.StackEmpty(*head):判斷一個(gè)在棧是否為空:

bool isempty(Linknode* head) {
	if (head->next == nullptr)  return true;
	else return false;
}

3.Push(*head,x):入棧:

void enqueue(Linknode* head,int x) {
	Linknode* L = new Linknode[sizeof(Linknode)];
	L->data = x;
	L->next = head->next;
	head->next = L;
}

4.Pop(*head):出棧:

void dequeue(Linknode* head)
{
	Linknode* L = new Linknode[sizeof(Linknode)];
	L = head->next;
	head->next = L->next;
	delete[] L;
}

5.GetTop(s,x):讀棧頂元素:

void gethead(Linknode* head)
{
	int x;
	x = head->next->data;
	cout << x << endl;
}

6.DestroyStack(&s):銷毀棧:

void DestroyStack(Linknode* head) {
	Linknode* p = new Linknode[sizeof(Linknode)];
	p = head->next;
	if (!isempty(head)) {
		while (head->next != nullptr)
		{
			head->next = p->next;
			delete[]p;
			p = head->next;
		}
	}
	delete[]p;
}

整體代碼:

#include<iostream>
using namespace std;
typedef struct Linknode {
	int data;
	struct Linknode* next;
};
void initlink(Linknode *head) {
	//head = new Linknode[sizeof(Linknode)];
	if (head == nullptr) cout << "分配失敗" << endl;
	else head->next = nullptr;
}
bool isempty(Linknode* head) {
	if (head->next == nullptr)  return true;
	else return false;
}
void enqueue(Linknode* head,int x) {
	Linknode* L = new Linknode[sizeof(Linknode)];
	L->data = x;
	L->next = head->next;
	head->next = L;
}
void dequeue(Linknode* head)
{
	Linknode* L = new Linknode[sizeof(Linknode)];
	L = head->next;
	head->next = L->next;
	delete[] L;
}
void gethead(Linknode* head)
{
	int x;
	x = head->next->data;
	cout << x << endl;
}
void DestroyStack(Linknode* head) {
	Linknode* p = new Linknode[sizeof(Linknode)];
	p = head->next;
	if (!isempty(head)) {
		while (head->next != nullptr)
		{
			head->next = p->next;
			delete[]p;
			p = head->next;
		}
	}
	delete[]p;
}
int main() {
	Linknode* h = new Linknode[sizeof(Linknode)];
	initlink(h);
	if (isempty(h)) cout << "鏈表空" << endl;
	for (int i = 0; i < 10; i++)
	{
		enqueue(h, i);
	}
	gethead(h);
	dequeue(h);
	gethead(h);
	DestroyStack(h);
	return 0;
}

執(zhí)行結(jié)果:

c++棧的基本操作,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-713158.html

到了這里,關(guān)于棧的概念及其基本操作--詳細(xì)(C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之棧的基本操作

    數(shù)據(jù)結(jié)構(gòu)之棧的基本操作

    該順序棧涉及到了存儲整型數(shù)據(jù)的順序棧還有存儲字符型數(shù)據(jù)的順序棧 實(shí)現(xiàn)的功能有:入棧、出棧、判斷是否為空棧、求棧的長度、清空棧、銷毀棧、得到棧頂元素 此外根據(jù)上述功能,編寫了數(shù)值轉(zhuǎn)換(十進(jìn)制轉(zhuǎn)化八進(jìn)制)方法、括號匹配方法。 控制臺界面展示: 進(jìn)棧展示

    2024年01月23日
    瀏覽(24)
  • 棧的定義及基本操作實(shí)現(xiàn)(順序棧)

    棧的定義及基本操作實(shí)現(xiàn)(順序棧)

    個(gè)人主頁:【??個(gè)人主頁】 系列專欄:【??數(shù)據(jù)結(jié)構(gòu)與算法】 學(xué)習(xí)名言:天子重英豪,文章教兒曹。萬般皆下品,惟有讀書高 第一章 ?? 學(xué)前知識 第二章 ?? 單向鏈表 第三章 ?? 遞歸 相信大家小時(shí)后一定玩過玩具槍吧,在我們裝子彈時(shí)玩具槍的子彈只能從彈夾的一

    2023年04月08日
    瀏覽(52)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈棧的基本操作(C語言)

    零零總總搜索了一些關(guān)于鏈棧的資料,了解了鏈棧的基本操作,一直覺得別人寫的代碼或多或少存在一些問題,所以打算自己寫一篇關(guān)于鏈棧的文章,也算是對所學(xué)知識的梳理和鞏固了。 首先說明本文使用C語言進(jìn)行鏈棧的基本操作,鏈棧是無頭結(jié)點(diǎn)的。這里補(bǔ)充說明一下,

    2024年02月05日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表基本操作實(shí)現(xiàn) (c++)

    數(shù)據(jù)結(jié)構(gòu)——單鏈表基本操作實(shí)現(xiàn) (c++)

    單鏈表鏈?zhǔn)酱鎯Y(jié)構(gòu)的特點(diǎn)是:用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素(這里存儲單元可以是連續(xù)的,也可以是不連續(xù)的),為了表示每個(gè)數(shù)據(jù)元素a與其直接后繼數(shù)據(jù)元素之間的邏輯關(guān)系,除了存儲信息本身外還要存儲一個(gè)指示其直接后繼的信息(地址). 這兩部分信

    2024年02月03日
    瀏覽(88)
  • 【c++】 list容器的基本操作與接口

    【c++】 list容器的基本操作與接口

    List容器是一個(gè)雙向鏈表。 采用動態(tài)存儲分配,不會造成內(nèi)存浪費(fèi)和溢出 鏈表執(zhí)行插入和刪除操作十分方便,修改指針即可,不需要移動大量元素 鏈表靈活,但是空間和時(shí)間額外耗費(fèi)較大 list構(gòu)造函數(shù) list數(shù)據(jù)元素插入和刪除操作 list大小操作 list賦值操作 l ist數(shù)據(jù)的存取 li

    2024年02月17日
    瀏覽(28)
  • 【C++】單鏈表——單鏈表的基本操作

    【C++】單鏈表——單鏈表的基本操作

    ?由于順序表的插入刪除操作需要移動大量的元素,影響了運(yùn)行效率,因此引入了線性表的鏈?zhǔn)酱鎯Α?單鏈表 。單鏈表通過一組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素,不需要使用地址連續(xù)的存儲單元,因此它不要求在邏輯上相鄰的兩個(gè)元素在物理位置上也相鄰。 單

    2024年02月03日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語言版)

    目錄 一、鏈棧 1、鏈棧的定義: 2、鏈棧的優(yōu)缺點(diǎn): 二、鏈棧的基本操作算法(C語言)???? 1、宏定義 ??2、創(chuàng)建結(jié)構(gòu)體 3、鏈棧的初始化? ?4、鏈棧的進(jìn)棧 5、鏈棧的出棧 6、獲取棧頂元素 7、棧的遍歷輸出 8、鏈棧的判空 ?9、求鏈棧的棧長 10、鏈棧的清空 11、鏈棧的銷毀

    2024年01月24日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)——C語言對棧的基本操作

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)——C語言對棧的基本操作

    ? ? ? ? ?棧(Stack)是一種常用的數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)后出(LIFO)的原則,對表尾進(jìn)行操作,常用于臨時(shí)存儲和撤銷等操作,其基本操作包括棧的創(chuàng)建、入棧(也叫壓棧Push)、出棧(又稱彈棧)、棧的遍歷、棧的清空(clear)、棧的銷毀(destroy)等。 ? ? ? ? 棧的創(chuàng)建有兩種方式,一種是通

    2024年02月07日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    目錄 一、順序棧 1、順序棧的定義: 2、順序棧的優(yōu)缺點(diǎn) 二、順序棧的基本操作算法(C語言)??? 1、宏定義 ?2、創(chuàng)建結(jié)構(gòu)體 3、順序棧的初始化? 4、順序棧的入棧 5、順序棧的出棧 6、取棧頂元素 7、棧的遍歷輸出 8、順序棧的判空 9、順序棧的判滿 ?10、求順序棧長度 11、順

    2024年01月24日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識)

    【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識)

    ??個(gè)人主頁: 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 ???系列專欄: 《數(shù)據(jù)結(jié)構(gòu)》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目錄 ?前言 棧 棧的概念和結(jié)構(gòu) 棧的實(shí)現(xiàn) ?編輯 數(shù)組棧的實(shí)現(xiàn) 總的聲明 初始化 ?插入 刪除 取棧頂元素 銷毀 判斷是否為空

    2024年02月03日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包