一、棧的基本概念
1.棧的定義
棧是一種只能在一端進行插入或刪除的線性表。其中允許進行插入或刪除操作的一端稱為棧頂(top)。棧的插入和刪除操作一般稱作入棧和出棧。
2.棧的特點
先進后出
3.棧的存儲結構
順序棧和鏈式棧
注意:鏈式棧通常采用單鏈表實現,並規定所有的操作都是在單鏈表的表頭進行的。而且對於帶頭結點和不帶頭結點的鏈棧,具體的實現會有所不同。
4.棧的數學性質
當n個元素以某種順序進棧,並且可在任意時刻出棧(滿足先進后出的前提),所獲得的元素排列的數目N恰好滿足:
\[N=\frac{1}{n+1} \times C_{2n}^n \]
二、結構體的定義
1.順序棧
typedef struct
{
int data[maxSize]; //存放棧中元素,maxSize是已經定義的常量
int top; //棧頂指針
}SqStack;
2.鏈棧結點定義
typedef struct LNode
{
int data; //數據域
struct LNode *next; //指針域
}LNode;
三、順序棧
1.順序棧的要素
(1)幾個狀態
1)棧空狀態
st.top == -1。(可能會出現st.top == 0的情況,具體問題具體分析)
2)棧滿狀態
st.top == maxSize-1。
3)非法狀態
上溢或下溢
(2)兩個操作
1)元素進棧。
++(st.top);
st.data[st.top]=x;
2)元素出棧
x=st.data[s.top];
--s.top;
2.初始化棧
void initStack(SqStack &st)
{
st.top=-1; //只需將棧頂指針設為-1
}
3.判空
int isEmpty(SqStack st)
{
if(st.top==-1)
{
return 1;
}
else
{
return 0;
}
}
4.進棧
int Push(SqStack &st,int x)
{
if(st.top==maxSize-1) //判斷是否棧滿
{
return 0;
}
++(st.top); // 先移動指針,再進棧
st.data[st.top]=x;
return 1;
}
5.出棧
int Pop(SqStack &st,int &x)
{
if(st.top==-1) //判斷是否為空
{
return 0;
}
x=st.data[s.top]; //先取出元素,再進棧
--st.top;
}
四、鏈棧
1.鏈棧的要素
(1)兩個狀態
1)棧空狀態
lst->next==NULL
2)棧滿狀態
不存在
(2)兩個操作
1)進棧(帶頭結點)
p->next=lst->next; lst->next=p;//其實就是頭插法建立單鏈表中的插入操作
2)出棧
p=lst->next;x=p->data;lst->next=p->next;free(p);//其實就是帶頭結點的單鏈表的刪除操作
2.初始化
void initStack(LNode *&lst) //lst要改變,采用引用型,&
{
lst=(LNode*)malloc(sizeof(LNode));//制造一個頭結點
lst->next=NULL;
}
3.判空
int isEmpty(LNode *lst)
{
if(lst->next==NULL)
{
return 1;
}
else
{
return 0;
}
}
4.進棧
void Push(LNode*lst,int x)
{
LNode *p;
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;//每當申請新結點的時候,將指針域設置為NULL,可以避免一些錯誤
/*以下就是鏈表的頭插法*/
p->data=x;
p->next=lst->next;
lst->next=p;
}
5.出棧
int Pop(LNode*&lst,int &x)
{
LNode *p;
if(lst->next==NULL)
{
return 0;
}
/*以下就是單鏈表的刪除操作*/
p=lst->next;
x=p->data;
lst->next=p->next;
free(p);
return 1;
}