1. 程式人生 > >順序棧與鏈式棧的實現

順序棧與鏈式棧的實現

棧的概念:

棧(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來代替頭結點,或