1. 程式人生 > >C++棧學習——順序棧和鏈棧的區別

C++棧學習——順序棧和鏈棧的區別

  • C++中棧有順序棧和鏈棧之分,在順序棧中,定義了棧的棧底指標(儲存空間首地址base)、棧頂指標top以及順序儲存空間的大小stacksize(個人感覺這個資料成員是可以不用定義的)
//順序棧資料結構C++類宣告(基類)
template <typename ElemType>
class SqStack 
{
public:
    void clear();                                                 //把順序棧置空
    int getLength();                                              //求順序棧中元素個數
int getstackSize(); //返回當前已分配的儲存空間的大小 Status getTop(ElemType & e); //讀棧頂的元素 bool isEmpty(); //判斷順序棧是否為空 SqStack<ElemType> operator =(SqStack<ElemType> rightS); //過載賦值運算子的定義
Status pop(ElemType & e); //彈出棧頂元素到e void push(ElemType & e ); //在棧頂壓入元素e //*****************************下面為系統自動呼叫建構函式及解構函式宣告******************************// SqStack(); //順序棧建構函式 virtual ~SqStack();//順序棧解構函式 SqStack (const
SqStack<ElemType>& otherS);//順序棧拷貝初始換建構函式 protected: ElemType *base; ElemType *top; int stackSize;//順序儲存空間的大小 };
  • 而對於鏈棧來說,它只定義棧頂指標。
template<typename ElemType>
class Linkstack
{

private:
    class LinkNode
    {
    public:
        ElemType data;
        LinkNode *next;
    };
    typedef LinkNode * NodePointer;

public:
    void clear();
    int getlength();
    void display();
    void randLinkStack();
    Linkstack <ElemType> operator = (Linkstack <ElemType> rightS);

protected:
    NodePointer top;

};

其實這二者的區別是由順序表和連結串列的儲存結構決定的,在空間上,順序表是靜態分配的,而連結串列則是動態分配的;就儲存密度來說:順序表等於1,而鏈式表小於1,但是鏈式表可以將很多零碎的空間利用起來;順序表查詢方便,鏈式表插入和刪除時很方便。
順序表的這種靜態儲存的方式,決定了必須至少得有首地址和末地址來決定一個空間,否則,不知道查詢到哪了;鏈式表每個節點儲存了下一個節點的指標資訊,故,對於鏈棧來說,只需要一個top指標即可查詢到整個棧。
另外,順序棧和鏈棧的top指標有區別,順序棧的top指標指向棧定的空元素處,top-1才指向棧定元素,而鏈棧的top指標相當於連結串列的head指標一樣,指向實實在在的元素。
另外附自己寫的順序棧和鏈棧的隨機產生函式:

//順序棧:
template<typename ElemType>
void MyStack<ElemType>::RandStack()
{
    int *p;
    ElemType n;
    ElemType Elem[11];
    srand(time(NULL));
    n=rand()%10+1;
    cout<<"產生的隨機棧的深度為:"<<n<<endl;
    cout<<"產生的隨機棧元素為:"<<endl;
    for (int i = 0; i < n; i++)
    {
        Elem[i]=rand()%100+1;
        cout<<Elem[i]<<"  ";
    }
    cout<<endl;
    base=new ElemType[n];
    assert(base!=0);
    top=base;
    stackSize=n;
    for (int j = 0; j < n; j++)
        *(base+j)=Elem[j];
    top=base+n;
    cout<<"隨機產生的棧為:"<<endl;
    for (int i = 0; i < stackSize; i++)
        cout<<"  "<<*(base+i);
    cout<<endl;
    cout<<"  ♂";
    for (int i = 1; i <stackSize ; i++)
    {
        setw(4);
        cout<<"    ";
    }
    cout<<"  ♂"<<endl;
    cout<<" base";
    for (int i = 1; i <stackSize ; i++)
    {
        setw(4);
        cout<<"    ";
    }
    cout<<" top"<<endl;

}

template<typename ElemType>
void MyStack<ElemType>::display()
{
    int n=top-base;
    cout<<"當前棧為:"<<endl;
    for (int i = 0; i < n; i++)
        cout<<"  "<<*(base+i);
    cout<<endl;
    cout<<"  ♂";
    for (int i = 1; i <n ; i++)
    {
        setw(4);
        cout<<"    ";
    }
    cout<<"  ♂"<<endl;
    cout<<" base";
    for (int i = 1; i <n ; i++)
    {
        setw(4);
        cout<<"    ";
    }
    cout<<" top"<<endl;
}

//鏈棧
template<typename ElemType>
void Linkstack<ElemType>::display()
{
    NodePointer r;
    int num=0;
    r=top;
    while (r)
    {
        cout<<r->data<<"  ";
        r=r->next;
        num++;
    }
    cout<<endl;
    for(int i=0;i<num-1;i++)
        cout<<setw(4)<<"  ";
    cout<<"↑"  ;
    cout<<endl;
    for(int i=0;i<num-1;i++)
        cout<<setw(4)<<"  ";
    cout<<"top"<<endl;

}

template <typename ElemType>
void Linkstack<ElemType>::randLinkStack()
{
    ElemType elem[11];
    srand(unsigned(time(NULL)));
    int n;
    n=rand()%10+1;
    cout<<"the number of the stack is:"<<n<<endl;
    cout<<"the elements here are:";
    for (int i = 0; i < n; i++)
    {
        elem[i]=rand()%100+1;
        cout<<elem[i]<<"  ";
    }
    cout<<endl;
    NodePointer p,s;
    p=NULL;
    for (int i = 0; i < n; i++)
    {
        s=new(LinkNode);
        assert(s!=NULL);
        s->data=elem[i];
        s->next=p;
        p=s;
    }
    top=p;
    cout<<"the stack produced is:"<<endl;
    NodePointer r;
    int num=0;
    r=top;
    while (r)
    {
        cout<<r->data<<"  ";
        r=r->next;
        num++;
    }
    cout<<endl;
    for(int i=0;i<num-1;i++)
        cout<<setw(4)<<"  ";
    cout<<"↑"  ;
    cout<<endl;
    for(int i=0;i<num-1;i++)
        cout<<setw(4)<<"  ";
    cout<<"top"<<endl;
}

相關推薦

順序順序佇列、佇列區別

1.順序棧 順序棧的主要特徵是用一個數組實現棧的儲存,top指標確定棧頂元素位置 定義形式如下: #define Max 100 template <class T> class SeqStack{ public: SeqStack():t

C++學習——順序區別

C++中棧有順序棧和鏈棧之分,在順序棧中,定義了棧的棧底指標(儲存空間首地址base)、棧頂指標top以及順序儲存空間的大小stacksize(個人感覺這個資料成員是可以不用定義的) //順序棧資料結構C++類宣告(基類) template <t

資料結構學習心得——順序

棧的定義 棧是限定盡在表尾進行插入或者刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂,相應地,表頭端稱為棧底。不含元素的空表稱為空棧。棧又稱為後進先出的線性表。 和線性表類似,棧也有兩種儲存表示方法。 順序棧,即棧的順序儲存結構是利用一

資料結構順序基本操作----c++實現

順序棧: #include<iostream> using namespace std; #define MaxSize 50 class SeqStack{ private: int

順序(stack)

順序棧和鏈棧(stack)   棧的定義:它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退

資料結構---------------------------------------順序的實現

今天想把這個順序棧實現一下,就翻閱資料整理了一下。 下面分別給出順序棧和鏈棧的相應功能的實現。 1)順序棧的圖示: 下面是程式碼: #include<iostream> #include<algorithm> #include<str

定義及其基本操作,順序

 棧和佇列是兩種特殊的線性表,它們的邏輯結構和線性表相同,只是其運算規則較線性表有更多的限制,故又稱它們為運算受限的線性表。棧和佇列被廣泛應用於各種程式設計中。棧的定義及基本運算1、棧的定義     棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表。  (1)通常稱插入、刪除的這一端為棧

線性表、、佇列的的順序儲存式儲存

先概括一下線性表順序儲存和鏈式儲存。 線性表的順序儲存是用一組地址連續的儲存單元依次儲存線性表的資料元素。 線性表的鏈式儲存是用指標將儲存線性表中的資料元素的那些單元依次串聯在一起。 接下來圖片說明。

實驗3:佇列的基本操作實現及其應用——順序佇列佇列

實驗3:棧和佇列的基本操作實現及其應用一、實驗目的1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2、      學會使用棧和佇列解決實際問題。二、實驗內容1、自己確定結點的具體資料型別和問題規模:分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操

實驗三、順序

一、實驗目的 1、 熟練掌棧的結構特點,掌握棧的順序儲存和鏈式儲存結構和實現。 2、 學會使用棧解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 三、程式碼 鏈棧

實驗3:佇列的基本操作實現及其應用——順序

實驗3:棧和佇列的基本操作實現及其應用一、實驗目的1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2、      學會使用棧和佇列解決實際問題。二、實驗內容1、自己確定結點的具體資料型別和問題規模:分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操

實驗三 順序

一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、      學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建立一

實驗四:順序

#ifndef SeqStack_H #define SeqStack_H const int StackSize=10; template class SeqStack { public: SeqStack(); ~SeqStack(){} void Push(DataType x); //

的數組表實現(Java實現)

javascrip search 分享圖片 sys blog inter () 結果 length 我以前用JavaScript寫過棧和隊列,這裏初學Java,於是想來實現棧,基於數組和鏈表。 下面上代碼: 1 import java.io.*; 2 //用接口來

順序表示實現

#include <iostream> using namespace std; const int MAXN = 1000+7; const int INF = 0X3f3f3f3f; typedef struct { int *base; // base不存元素 in

實驗二:順序順序佇列,佇列

#include<iostream.h>const int QueueSize=100;struct Node{ int data; Node *next;};class LinkQueue{public: LinkQueue(); ~LinkQueue(){}; void EnQueue(int

資料結構(C++)-用順序結構實現的模板類

棧:last in first out 1.MStackADT.h #ifndef MSTACKADT_H #define MSTACKADT_H /* Create by軟體工程 gpwner 2016年11月20日 */ template<c

的實現及其相關操作詳解

#include <iostream>#include <typeinfo>using namespace std;/*用模板實現鏈式棧和鏈式佇列,採用繼承結構*/template<typename T>class DSBase{public:virtual void pu

C#——實現泛型順序佇列式佇列

順序佇列,使用List為儲存器 /// 順序佇列 class MyQueue<T> { List<T> list; public MyQueue() {

的資料結構以及的實現

線性表有順序儲存結構和鏈式儲存結構,棧屬於線性表的一種,也具有順序儲存結構和鏈式儲存結構。對於棧的鏈式儲存結構,一般稱之為鏈棧。 棧的插入和刪除只在棧頂進行操作,在單鏈表中,頭指標是單鏈表的必須元素;而在棧中,棧頂指標也是鏈棧的必須元素,且一般將棧頂放在單鏈表