1. 程式人生 > >【棧】C++棧的建立、初始化、插入、刪除

【棧】C++棧的建立、初始化、插入、刪除

棧是限定在尾部進行插入或刪除的線性表。表尾稱為棧頂(top),表頭稱為棧底(base)。棧的修改按照後進先出的原則。

棧有兩種儲存表示方法:順序棧和鏈棧。順序棧是利用一組連續儲存單元依次存放棧底到棧頂資料元素的位置。鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指標就是連結串列的頭指標。

注意:

1.如果在函式中需要修改形參,而且希望函式結束後變數修改生效,可以使用引用的方法。例如把棧頂元素傳給e的函式:int Pop(Stack &s,int &e),在函式中我們需要把棧頂元素傳給e,並且刪除棧頂,如果直接int Pop(Stack s,int e),傳遞的只是實參的副本,不能修改實參。

2.指標變數做形參時,若要修改它指向的地址,則需要使用引用,如果修改其地址中的引數比如value、next等,可以不使用引用。

一、順序棧

1.用陣列實現順序棧

這種方式直接用陣列儲存棧中的內容,用top記錄棧頂在陣列中的位置。通過移動top完成各種操作。棧為空時,top=-1,此後每新增一個元素,top++,每取出一個元素,top下移表示刪除棧頂,實際上元素還在陣列中。

#include<iostream>
#define MAX 100//定義陣列長度
using namespace std;
struct Stack//建立棧
{
	int value[MAX];
	int top;//棧頂的陣列序號
};
void Init(Stack &s)//初始化棧
{
	s.top=-1;
}
int Push(Stack &s,int e)//把元素e壓入棧頂
{
	if(s.top>MAX-1)//如果超出棧的容量,返回0
		return 0;
	s.top++;//棧頂加1
	s.value[s.top]=e;//把e賦給棧頂
	return 1;
}
int IsEmpty(Stack s)//判定棧是否為空
{
	if(s.top==-1)
		return 1;
	else
		return 0;
}
<pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">int Push(Stack &s,int e)</span><span style="font-family: Arial, Helvetica, sans-serif;">//取出棧頂元素,刪除棧頂</span>
{if(s.top==-1)return 0;e=s.value[s.top];s.top--;//棧頂序號-1表示刪除棧頂}int main(){Stack sqstack;Init(sqstack);cout<<"輸入一串整數(輸入非數字結束):"<<endl;int e;while(cin>>e)//將輸入值依次壓入棧頂Push(sqstack,e);while(!IsEmpty(sqstack))//若棧不為空,依次輸出棧{Pop(sqstack,e);cout<<e<<" ";}return 0;} 2.順序棧的一般實現

這種實現方式設定棧頂top和棧底base,棧為空時top和base重合,插入一個元素top加1,取出一個元素top減1。

非空棧的棧頂指標始終位於棧頂元素的下一個位置。這種方法可以不指定棧的長度,設定一個基本容量和增量,先分配基礎容量,棧的空間不夠時,再增加容量。

程式採用C語言中的malloc分配記憶體,於是可以使用realloc給malloc分配好的記憶體增加容量。但C++中常用的new和delete不能追加容量。

#include<iostream>
#define SIZE 100//基礎容量
#define dtSIZE 10//附加容量(可多次擴容)
using namespace std;
struct SqStack
{
	int *top;//棧頂指標
	int *base;//棧底指標
	int size;//棧的當前容量
};
void Init(SqStack &s)//初始化棧
{
	s.base=(int *)malloc(SIZE*sizeof(int)); 
	//s.base=new int [SIZE];//使用new不能追加空間
	if(!s.base) exit(-1);//記憶體分配失敗
	s.top=s.base;
	s.size=SIZE;
}
int Push(SqStack &s, int e)//把元素e壓入棧頂
{
	if(s.top-s.base>s.size)//棧滿,追加dtSIZE大小的空間
	{
		s.base=(int *)realloc(s.base,(s.size+dtSIZE)*sizeof(int)); 
		if(!s.base)	exit(-2);//記憶體分配失敗
		s.size=s.size+dtSIZE;
	}
	*s.top=e;//把e賦給棧頂
	s.top++;//棧頂指標+1
	return 1;
}
int Pop(SqStack &s,int &e)//取出棧頂元素,並刪除棧頂
{
	if(s.top==s.base)//top與base重合時,棧為空
		return 0;
	s.top--;//top先減1,再取元素
	e=*s.top;
	return 1;
}
int IsEmpty(SqStack s)//判空
{
	if(s.top==s.base)
		return 1;
	else
		return 0;
}
void Destroy(SqStack &s)//銷燬棧
{
	free(s.base);
	//delete s.base;//如果使用new分配記憶體,則用delete刪除。
}
int main()
{
	SqStack slist;
	Init(slist);
	cout<<"輸入一串數字,(以非數字結束):"<<endl;
	int e;
	while(cin>>e)
	{
		Push(slist,e);//將讀取的數字壓入棧頂
	}
	while(!IsEmpty(slist))//棧不為空時
	{
		Pop(slist,e);//取出棧頂元素,並刪除棧頂
		cout<<e<<" ";
	}
	Destroy(slist);
	return 0;
}

二、鏈棧

鏈棧的結構與連結串列相似,只是插入與刪除等操作都在連結串列的頭部,即鏈棧是一個以top為頭結點,從棧頂指向棧底的單鏈表。

#include<iostream>
using namespace std;
struct ListStack
{
	int value;
	ListStack *next;
};
void Init(ListStack *s)//初始化
{
	s->next=NULL;//棧頂指標下一個置空表示棧為空
}
void Push(ListStack *s,int e)//把元素e壓入棧頂
{
	ListStack *p;
	p=new ListStack;
	p->value=e;
	p->next=s->next;
	s->next=p;
}
int Pop(ListStack *s,int &e)//把棧頂元素取出賦給e,並刪除棧頂
{
	ListStack *delete_r;
	if(s->next==NULL)
		return 0;
	else
	{
		delete_r=s->next;
		e=s->next->value;
		s->next=delete_r->next;
		delete delete_r;
	}
}
void Destroy(ListStack *s)//銷燬棧
{
	ListStack *delete_q;
	while(s->next!=NULL)
	{
		delete_q=s->next;
		s->next=s->next->next;
		delete delete_q;
	}
}
int IsEmpty(ListStack *s)//判空
{
	if(s->next==NULL)
		return 1;
	else
		return 0;
}
int main()
{
	ListStack *slist;
	slist=new ListStack;
	Init(slist);
	int e;
	while(cin>>e)
		Push(slist,e);
	while(!IsEmpty(slist))
	{
		Pop(slist,e);
		cout<<e<<" ";
	}
	Destroy(slist);
	return 0;
}




相關推薦

C語言實現連結串列的建立初始插入刪除,查詢

#include <stdio.h> #include <stdlib.h> #define OK 0 #define ERROR -1 #define MALLOC_ERROR -2 typedef int

C++建立初始插入刪除

棧是限定在尾部進行插入或刪除的線性表。表尾稱為棧頂(top),表頭稱為棧底(base)。棧的修改按照後進先出的原則。 棧有兩種儲存表示方法:順序棧和鏈棧。順序棧是利用一組連續儲存單元依次存放棧底到棧頂資料元素的位置。鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指標就是連結串

C++可變參數列表處理宏va_listva_startva_end的使用

sin 不同 struct rto snprintf 指定 cnblogs 最小 多個 VA_LIST是在C語言中解決變參問題的一組宏他有這麽幾個成員: 1)va_list型變量: #ifdef _M_ALPHA typedef struct{ char*  

DWM1000 code 解密一 工程初始代碼分析

eof associate 回調函數 pre ack 也有 tca use fas Draft ,以後整理 instance_init 函數追下去,絕大多數的代碼都在初始化如下結構體 typedef struct { INST_MODE mode; instan

Python之數據序列(jsonpickleshelve)

大數 保密 不兼容 air shelf pickle 優點 訪問問題 josn 【轉】Python之數據序列化(json、pickle、shelve) 本節內容 前言 json模塊 pickle模塊 shelve模塊 總結 一、前言 1. 現

Openmv多顏色識別常用初始

# 多顏色跟蹤示例 # # 這個例子顯示了使用OpenMV的多色跟蹤。 import sensor, image, time # 顏色跟蹤閾值(L Min, L Max, A Min, A Max, B Min, B Max) # 下面的閾值跟蹤一般紅色/綠色的東西。你不妨調整他們...

java類載入和例項:靜態程式碼塊初始程式碼塊構造方法的執行順序

java中第一次例項化一個物件時,靜態程式碼塊、初始化塊、屬性的初始化、構造方法,再加上如果父類也有這些東西,天,到底執行順序是什麼? 來一段程式碼試一試就知道了: public class LoadingTest { public static void main(

轉載c++中堆內存分配

操作系統 取字符 自由 分別是 動手 word 函數 內存分配 繼續 一、內存劃分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數參數值,局部變量值等。其操作方式類似於數據結構中棧。2、堆區(heap) — 一般由程序員分配釋放, 若程

12python 型數據結構模擬隊列型數據結構模擬

出隊 分隔 ima bubuko pop nbsp info image img 一、壓棧操作模擬 #__author:"吉*佳" #date: 2018/10/21 0021 #function:棧 # 棧:即是先進後出的一種數據結構 # (1)模擬壓棧操作 st

12python 型資料結構模擬佇列型資料結構模擬

一、壓棧操作模擬 #__author:"吉*佳" #date: 2018/10/21 0021 #function:棧 # 棧:即是先進後出的一種資料結構 # (1)模擬壓棧操作 stack=[] flag=True while flag: temp = input("請輸入壓棧元素[

C++類中靜態成員的宣告初始

【C++】類中靜態成員的宣告、初始化 類中靜態成員的宣告 初始化 靜態資料成員值的改變 完整例子 有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/784

C++中堆和的理解

一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計

順序的定義初始等操作 C++程式碼實現 ——感想

using namespace std; /*順序棧的定義*/ #define Stack_Size 100 typedef struct sqStack {        char *elem;        int top;        int stackSize;//棧陣列長度 }sqStack;

轉載C#掃盲之:帶你掌握C#的擴展方法以及探討擴展方法的本質註意事項

title [] 很多 標記 真的 參考資料 console 需求 length 1、為什麽需要擴展方法 .NET3.5給我們提供了擴展方法的概念,它的功能是在不修改要添加類型的原有結構時,允許你為類或結構添加新方法。 思考:那麽究竟為什麽需要擴展方法呢,為什麽不直接修

C# Linq 交集並集差集去重

log .cn pre tin nio clas int except post 轉自: https://www.cnblogs.com/wdw31210/p/4167306.html using System.Linq; List<string&

作業模擬dfs

模擬 clu AD string crt code warnings style cin 題意:一個迷宮,起點到終點的路徑,不用遞歸。 題解: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include

洛谷P1155 NOIP2008排序

題目連結 題解 這題有點神啊。。 我們仔細觀察一下,發現兩個棧內元素必須為降序 那麼有結論 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)則\(i\)和\(j\)不能存在於同一個棧 證明: 因為棧內元素必須降序, 那麼加入\(a[j]\)時一定彈

DFS 求迷宮問題的所有路徑和最短路徑

 1++.cpp 方法來源  https://blog.csdn.net/zhouchenghao123/article/details/83626222 博主 :ZAX1  ,部落格:用棧解決迷宮問題(輸出所有路徑和最短路徑) //【DFS】 用 棧

演算法使用檢查表示式的括號匹配

使用棧檢查表示式的括號匹配 給定一個表示式字串exp,編寫一個程式來檢查對和“{”,“}”,“(”,“)”,“[”,“]”的順序是否在exp中是正確的。 例如,程式應該為exp =“[()] {} {[()()]()}”列印為true,對於exp =“[(])”

leetcode買賣股票的最佳時機 II(PythonC解答)

題目: 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個演算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 示例 1: 輸入: [7