資料結構學習心得——順序棧和鏈棧
阿新 • • 發佈:2019-01-07
棧的定義
棧是限定盡在表尾進行插入或者刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂,相應地,表頭端稱為棧底。不含元素的空表稱為空棧。棧又稱為後進先出的線性表。
和線性表類似,棧也有兩種儲存表示方法。
順序棧,即棧的順序儲存結構是利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,同時附設指標top只是棧頂元素在順序棧中的位置。這裡以top=-1表示空棧。
鏈式棧可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用陣列實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指標空間用來存放指標域。
程式碼實現
已下C++程式碼分別實現了順序棧,鏈棧的初始化,入棧和出棧的一系列操作。鏈棧的入棧操作類似於連結串列的頭插法建立連結串列。
#include <iostream>
using namespace std;
//順序棧定義
typedef struct SqStack
{
int data[20];
int top;
}SqStack;
//鏈棧結點定義
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
//初始化順序棧
void initStack(SqStack &st)
{
st.top = -1;
}
//判斷順序棧空
int isEmpty(SqStack st)
{
if (st.top == -1)
return 1;
else
return 0;
}
//順序棧進棧
int push(SqStack &st,int x)
{
if(st.top==20)
{
return 0;
}
else
{
st.data[++st.top]=x;
return 1;
}
}
//順序棧出棧
int pop(SqStack &st,int &x)
{
if(isEmpty(st))
{
return 0;
}
else
{
x = st.data[st.top--];
return 1;
}
}
//初始化鏈棧
void initLNodeStack(LNode *&L)
{
L = new LNode;
L->next = NULL;
}
//鏈棧判斷棧空
int isLNodeEmpty(LNode *L)
{
if(L->next == NULL)
return 1;
else
return 0;
}
//鏈棧進棧
void pushLNode(LNode *&L,int x)
{
LNode *p = new LNode;
p->data = x;
p->next = L->next;
L->next = p;
}
//鏈棧出棧
int popLNode(LNode *&L,int &x)
{
if(isLNodeEmpty(L))
{
return 0;
}
else
{
LNode *p = new LNode;
p = L->next;
L->next = p->next;
x = p->data;
delete p;
return 1;
}
}
int main()
{
return 0;
}