順序棧與鏈式棧的實現
棧的概念:
棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
順序棧:
base.h
這個標頭檔案主要用來存放公用的常量和型別。
//base.h
//-----公用的常量和型別----------
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#include<malloc.h>
#include<string.h>
//函式結果狀態程式碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 //不可行的 infeaslble
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
sq_Stack.h
sq_Stack.h標頭檔案用來具體實體實現棧的基本操作。
//sq_stack.h 順序棧
//-------------棧的順序儲存表示----------------
#define STACK_INIT_SIZE 100 //儲存空間初始分配量
#define STACKINCREMENT 10 //儲存空間分配增量
typedef struct{
SElemType *base; //在棧構造之前和銷燬之後,base的值為NULL
SElemType *top; //棧頂指標
int stacksize; //當前分配的儲存空間,以元素為單位
}SqStack;
//----基本操作的函式原型說明-----------
//構建一個空棧S
Status InitStack_Sq(SqStack &S){
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) //判斷是否空間分配成功
exit(OVERFLOW);
S.top = S.base; //棧頂與棧底指向同一個位置
S.stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack_Sq
//銷燬棧S
Status DestroyStack_Sq(SqStack &S){
if(S.base){
free(S.base);
S.top = S.base = NULL;
S.stacksize = 0;
cout<<"棧銷燬成功!"<<endl;
return OK;
}else{
cout<<"棧不存在,不需要銷燬!"<<endl;
return ERROR;
}
}//DestroyStack_Sq
//初始條件:棧S存在
//操作結果:清空棧
Status CleanStack_Sq(SqStack &S){
S.top = S.base;
return OK;
}//CleanStack_Sq
//初始條件:棧S存在
//操作結果:若為空棧,返回TRUE,否則FALSE
Status StackEmpty_Sq(SqStack S){
if(S.top == S.base){
cout<<"棧為空!"<<endl;
return TRUE;
}
else{
cout<<"棧不為空!"<<endl;
return FALSE;
}
}//StackEmpty_Sq
//初始條件:棧S存在
//操作結果:返回棧內元素個數,即棧的長度
int StackLength_Sq(SqStack S){
int len;
len = (S.top - S.base);
return len;
}//StackLength_Sq
//初始條件:棧S存在
//操作結果:用e返回S的棧頂元素
Status GetTop_Sq(SqStack S, SElemType &e){
if(S.top == S.base)//判空
return ERROR;
else{
e = *(S.top - 1);
return OK;
}
}//GetTop_Sq
//初始條件:棧S存在
//操作結果:插入元素e為新的棧頂元素
Status Push_Sq(SqStack &S, SElemType e){
//判滿,追加儲存空間
if(S.top - S.base >= S.stacksize){
S.base = (SElemType *)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S.base)//儲存分配失敗
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e; //插入元素
return OK;
}//Push_Sq
//初始條件:棧S存在
//操作結果:刪除S的棧頂元素,並用e返回其值
Status Pop_Sq(SqStack &S, SElemType &e){
if(S.top == S.base) //判空
return ERROR;
e = *--S.top; //返回刪除元素的值
return OK;
}//Pop_Sq
//初始條件:棧S存在
//操作結果:遍歷棧元素並顯示
Status StackTraverse_Sq(SqStack S){
if(S.base){ //判斷棧是否存在
if(S.top == S.base) //判空
cout<<"此棧是個空棧!"<<endl;
else{
SElemType *p;
p = S.top;
while(p > S.base)
{
p--;
cout<<*p<<" ";
}
cout<<endl;
}
return OK;
}else{
cout<<"棧不存在!"<<endl;
return ERROR;
}
}//StackTraverse_Sq
sqStackText.cpp
用來測試順序棧的基本操作函式。
#include "base.h"
#include "sq_stack.h"
//用來測試順序棧的基本操作
int main(){
SqStack S;
SElemType e;
InitStack_Sq(S);
StackTraverse_Sq(S);
//給空棧賦值
for(e = 0; e<10; e++){
Push_Sq(S, e);
}
cout<<"棧的遍歷:";
StackTraverse_Sq(S);
Push_Sq(S, 15);
cout<<"壓棧15後棧的遍歷:";
StackTraverse_Sq(S);
Pop_Sq(S, e);
cout<<"出棧後棧的遍歷:";
StackTraverse_Sq(S);
cout<<"被刪除的元素是:"<<e<<endl;
GetTop_Sq(S, e);
cout<<"獲取棧頂元素:"<<e<<endl;
cout<<"棧的長度為(即棧內元素個數):"
<<StackLength_Sq(S)<<endl;
cout<<"判棧空:";
StackEmpty_Sq(S);
cout<<"清空棧!"<<endl;
CleanStack_Sq(S);
cout<<"判棧空:";
StackEmpty_Sq(S);
cout<<"銷燬棧:";
DestroyStack_Sq(S);
cout<<"再次銷燬棧:";
DestroyStack_Sq(S);
return OK;
}
程式執行結果:
鏈式棧:
link_stack.h
鏈式表的具體程式碼實現:
//link_stack.h 鏈式棧
//-------------棧的鏈式儲存表示----------------
#define STACK_INIT_SIZE 100 //儲存空間初始分配量
#define STACKINCREMENT 10 //儲存空間分配增量
typedef struct StackNode{
SElemType date; //資料域
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top; //棧頂
int count; //記錄棧元素個數
}*PLinkStack;
//----基本操作的函式原型說明-----------
//構建一個空棧S
Status InitStack_L(PLinkStack* S){
//分配一個節點的初始化空間
*S = (PLinkStack)malloc(sizeof(struct LinkStack));
(*S)->top = NULL; //棧頂指標指向空
(*S)->count = 0; //棧中元素個數初始為0
return OK;
}//InitStack_L
//初始條件:棧S存在
//操作結果:清空棧
Status CleanStack_L(PLinkStack &S){
LinkStackPtr p;
//棧不為空時,進行迴圈,釋放每一個節點的空間
while(S->top){
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
}
return OK;
}//CleanStack_L
//銷燬棧S
Status DestroyStack_L(PLinkStack* S){
CleanStack_L(*S); //先清空棧
free(*S); //釋放棧所有空間
cout<<"棧銷燬成功!"<<endl;
return OK;
}//DestroyStack_L
//初始條件:棧S存在
//操作結果:若為空棧,返回TRUE,否則FALSE
Status StackEmpty_L(PLinkStack S){
if(S->top){ //棧頂存在
cout<<"棧不為空!"<<endl;
return TRUE;
}else{
cout<<"棧為空!"<<endl;
return FALSE;
}
}//StackEmpty_L
//初始條件:棧S存在
//操作結果:返回棧內元素個數,即棧的長度
int StackLength_L(PLinkStack S){
return S->count;
}//StackLength_L
//初始條件:棧S存在
//操作結果:用e返回S的棧頂元素
Status GetTop_L(PLinkStack S, SElemType &e){
if(!S->top)
return ERROR;
e = S->top->date;
return OK;
}//GetTop_L
//初始條件:棧S存在
//操作結果:插入元素e為新的棧頂元素
Status Push_L(PLinkStack &S, SElemType e){
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(struct StackNode));
p->date = e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}//Push_L
//初始條件:棧S存在
//操作結果:刪除S的棧頂元素,並用e返回其值
Status Pop_L(PLinkStack &S, SElemType &e){
LinkStackPtr p;
if(!S->top){
return ERROR;
}
e = S->top->date;
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
return OK;
}//Pop_L
//初始條件:棧S存在
//操作結果:遍歷棧元素並顯示
Status StackTraverse_L(PLinkStack S){
if(S->top){
LinkStackPtr p;
p = S->top;
while(p){
cout<<p->date<<" ";
p = p->next;
}
cout<<endl;
return OK;
}else{
cout<<"此棧為空棧!"<<endl;
return OK;
}
}//StackTraverse_L
linkStackText
鏈式棧的測試:
void linkStackText(){
PLinkStack S;
SElemType e;
InitStack_L(&S);
StackTraverse_L(S);
//給空棧賦值
for(e = 0; e<10; e++){
Push_L(S, e);
}
cout<<"棧的遍歷:";
StackTraverse_L(S);
Push_L(S, 15);
cout<<"壓棧15後棧的遍歷:";
StackTraverse_L(S);
Pop_L(S, e);
cout<<"出棧後棧的遍歷:";
StackTraverse_L(S);
cout<<"被刪除的元素是:"<<e<<endl;
GetTop_L(S, e);
cout<<"獲取棧頂元素:"<<e<<endl;
cout<<"棧的長度為(即棧內元素個數):"
<<StackLength_L(S)<<endl;
cout<<"判棧空:";
StackEmpty_L(S);
cout<<"清空棧!"<<endl;
CleanStack_L(S);
cout<<"棧的遍歷:";
StackTraverse_L(S);
cout<<"判棧空:";
StackEmpty_L(S);
cout<<"銷燬棧:";
DestroyStack_L(&S);
}
鏈式棧測試執行結果:
相關推薦
順序棧與鏈式棧的實現
棧的概念: 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除
順序棧與鏈式棧的圖解與實現
![](https://img2020.cnblogs.com/other/2024393/202012/2024393-20201209101308573-282865479.png)# 順序棧與鏈式棧的圖解與實現 - 棧是一種特殊的線性表,它與線性表的區別體現在增刪操作上 - 棧的特點是先進後出,後
順序棧與鏈式棧型別的定義
順序棧:#define StackSize 100/*假定預分配的棧的空間為100個元素*/typedef char DataType;/*假定棧元素的資料型別為字元*/typedef struct{ dataType data[StackSize];//定義棧陣列
Java程式碼實現順序棧和鏈式棧
Java程式碼實現順序棧和鏈式棧 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入或者刪除運算。後進先出(Last In First Out)。 棧中的資料操作主要有push(壓入)和pop(彈出)操作。 實際上,棧就可以用陣列來實現,也可
資料結構筆記之用C++實現順序棧和鏈式棧
這裡介紹兩種實現棧的方式:“順序棧”和“鏈式棧”,各有各的優缺點。 不管是“順序棧”還是“鏈式棧”,我們可以先定義一個棧的ADT(抽象資料型別),如下面的“stack.h” #ifndef STACK_H #define STACK_H const int
資料結構 棧(順序棧,鏈式棧,用棧實現計算器)
一、棧的概念 1. 棧是一個特殊的線性表,只能在一端操作:棧頂(top):允許操作 的一端 棧底(bottom):不允許操作的一端 2
c++順序棧和鏈式棧的實現
基本定義: 棧(Stack)是n個元素a1,a2,…an,組成的有限序列,記作S =(a1,a2,…,an),並且只能在一端插入和刪除元素,n=0時稱為空棧。棧的特徵: 由於棧只能從一端插入和刪除元素,故棧具有後進先出(Last in,first out,LIFO)的特性。
Java的順序棧和鏈式棧
urn implement public 可能 object 指定大小 常數 額外 異常 棧的定義 棧是限制在表的一段進行插入和刪除的運算的線性表,通常能夠將插入、刪除的一端為棧頂,例外一端稱為棧底,當表中沒有任何元素的時候稱為空棧。 通常刪除(又稱“退棧”)叫做彈出pop
資料結構——線性表:順序棧,鏈式棧(C++)
內容概要: 棧的基本概念及注意事項 順序棧、鏈式棧的C++模板類的實現 棧的基本概念及注意事項: 棧(stack)是限定僅在一端進行插入或刪除操作的線性表。 與順序表和連結串列一樣,棧分為順序棧和鏈式棧。 棧頂(top)元素、入棧(push)、出棧(
用棧(鏈式)實現十進位制到其他進位制的轉換:
用棧實現十進位制到其他進位制的轉換,此處最大進位制設為十六進位制,可以自行拓展。 主要方法:除商倒數取餘 #include <iostream> using namespace std; //棧節點,使用的是鏈棧結構 struct node { int d
佇列的順序儲存與鏈式儲存
佇列就是我們日常生活中的排隊,佇列也是一種線性表,與堆疊相反,佇列的入列必須在隊尾,出列必須在隊頭。與一般的線性表不同,佇列的操作只能在兩端,一端插入一端刪除,先進先出。(堆疊只能在一端進行操作,所以先進後出)。佇列的儲存方式這裡講兩種,首先第一種是用陣列的方式實現佇列的順序
順序儲存與鏈式儲存的集合-HashMap、HashTable
HashMap,日常最常用的資料結構之一。它是基於雜湊表的 Map 介面的實現,以key-value的形式存在。在HashMap中,key-value總是會當做一個整體來處理,系統會根據hash演算法
棧(鏈式棧)----C語言
logs links htm mil 等於 sizeof 回顧 ont efi 鏈式棧:就是一種操作受限的單向鏈表,對單向鏈表還不了解的可先看一下之前的一篇關於單向鏈表的隨筆,鏈表(單向鏈表的建立、刪除、插入、打印),理解了單向鏈表後再來看鏈式棧就比較輕松了 鏈式棧的
[數據結構與算法] : 棧的鏈式實現
creat 測試文件 stderr reat sem col for create eat 頭文件 1 typedef int ElementType; 2 3 #ifndef _STACKLI_H_ 4 #define _STACKLI_H_ 5
C語言——棧的實現(順序棧,兩個順序棧共享空間,鏈式棧)
1.什麼是棧 棧是一種只能在一端進行插入或者刪除操作的線性表)。其中允許進行插入或者刪除操作的一端稱為棧頂。棧的插入和刪除一般叫入棧和出棧。棧的順序儲存結構叫做==順序棧==,棧的鏈式儲存結構叫做==鏈棧==。 2.棧的特點 棧的特點是==後進先出== 3.順序棧 標頭檔
棧的物理實現(順序棧+鏈式棧)
說明 基於順序表實現的順序棧 基於連結串列實現的鏈式棧 一、說明: 本文中基於順序表實現的順序棧中top指的是棧中第一個空閒位置,基於連結串列實現的鏈式棧中top指向鏈式棧中第一個結點(棧頂)的指標,無頭結點。 二、基於順序表實現的順序棧 Stack.h #inc
棧與佇列-順序棧與鏈棧類模板的實現(資料結構基礎 第3周)
這是用C++編寫的棧的類模板的實現,包括順序棧和鏈棧,並進行了簡單的測試。 程式碼中srrStack類和lnkStack類均繼承於Stack類, Stack類可以看成是棧的邏輯結構(ADT抽象資料型別,Abstract Data Type)。注意這裡實現是棧與
棧的鏈式結構表示與實現——自己寫資料結構
今天給大家介紹棧的鏈式結構,用dev-c++4.9.9.2除錯通過,少廢話直接上程式碼: 資料結構體存放檔案stacklist.h檔案如下 #ifndef _STACKLIST_H_ #define _STACKLIST_H_ typedef struct _No
鏈式棧-C語言實現
amp ron truct include 數據 類型 nod lse ext 相對於順序棧的空間有限,鏈式棧的操作則更加靈活 #include<stdio.h> #include<malloc.h> typedef int SElemType
棧的鏈式儲存結構實現()
18.11.18 學習過之前的順序的棧了,這回介紹一下鏈式的棧 我們對棧進行操作時,通常都是在其棧頂進行,所以我們應該在鏈的頭部進行操作,我們之前學過的連結串列大多是有頭結點的,頭結點可以大大方便我們對連結串列的呼叫,現在,我們的這個鏈棧可以通過設定一個棧頂指標top來代替頭結點,或