1. 程式人生 > >資料結構---------------------------------------順序棧和鏈棧的實現

資料結構---------------------------------------順序棧和鏈棧的實現

今天想把這個順序棧實現一下,就翻閱資料整理了一下。

下面分別給出順序棧和鏈棧的相應功能的實現。

1)順序棧的圖示:

下面是程式碼:

#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXSIZE 100
using namespace std;
typedef int SElemType;
typedef int Status;
typedef struct
{
    SElemType *base; //棧底指標
    SElemType *top; //棧頂指標
    int stacksize;
}SqStack;
//順序棧的初始化
Status InitStack(SqStack &S)
{
    S.base = new SElemType[MAXSIZE]; //為順序棧分配一個大小為MAXSIZE的陣列空間
    if(!S.base)
        return 0;
    S.top = S.base; //棧底和棧頂指標都指向棧底的位置
    S.stacksize = MAXSIZE; //棧的容量為MAXSIZE
    return 1;
}
//判斷棧是否為空
int StackEmpty(SqStack S)
{
    if(S.top == S.base)
        return 0;
    else
        return 1;
}
//求順序棧的長度
int StackLength(SqStack S)
{
    return S.top - S.base;
}
//清空順序棧
Status ClearStack(SqStack &S)
{
    if(S.base)
        S.top = S.base;
    return 1;
}
//順序棧入棧
Status StackPush(SqStack &S,SElemType e) //將元素e壓入棧頂
{
    if(S.top - S.base == S.stacksize) //棧滿的情況
        return 0;
    *S.top++=e; //將元素e壓入棧頂並使棧頂指標加1
    return 1;
}
//順序棧的出棧
Status StackPop(SqStack &S,SElemType &e)
{
    if(S.top == S.base) //棧空的情況
        return 0;
    e = *--S.top; //獲取棧頂元素e並使棧頂指標減1
    return 1;
}
//取順序棧棧頂元素
Status GetTop(SqStack S,SElemType &e)
{
    if(S.top == S.base)
        return 0; //這種情況說明棧空,直接退出
    e = *(S.top - 1);
    return 1;
}
int main()
{
    ios::sync_with_stdio(false);
    SqStack S;
    InitStack(S);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) //往棧中壓入n個元素
        StackPush(S,i);
    int t;
    cin>>t;
    while(t--) //彈出棧中t個元素即依次取棧頂元素
    {
        int m;
        cin>>m;
        StackPop(S,m);
        cout<<m<<endl;
    }
    cout<<StackLength(S)<<endl; //輸出操作之後棧的長度
    if(StackEmpty(S))
        cout<<"此時棧非空!"<<endl;
    else
        cout<<"棧空!"<<endl;
    ClearStack(S); //清空棧
    if(StackEmpty(S))
        cout<<"此時棧非空!"<<endl;
    else
        cout<<"棧空!"<<endl;
    return 0;
}