目錄
鏈棧的實現和表示
鏈棧是指采用鏈式存儲結構實現的棧。通常鏈棧用單鏈表來表示。
這里沒有頭結點,鏈表的頭部就是棧頂。
鏈棧的存儲結構:
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
} StackNode,*LinkStack;
1.初始化
算法思想:構造一個空棧,直接將棧頂指針置空
2.入棧
算法思想:為入棧元素動態分配一個結點空間(和順序棧不同的是,這是動態分配,不像順序棧得提前分配一個最大容量,后續加入元素直接再分配,不用考慮棧滿的情況)
算法步驟:
- 為入棧元素 e 分配空間, 用指針 p 指向。
- 將新結點數據域置為e。
- 將新結點插入棧頂。(p->next=S;)
- 修改棧頂指針為 p。(S=p;)

3.出棧
算法思想:判斷棧是否為空,鏈棧在出棧后需要釋放出原棧元素的棧頂空間(先用了一個指針臨時保存了棧頂元素的空間,棧頂指針向下挪一位,原來棧頂空間需要被釋放)
算法步驟:
- 判斷棧是否為空 , 若空則返回ERROR。
- 將棧頂元素賦給e。(e=S->data;)
- 臨時保存棧頂元素的空間, 以備釋放。(p=S;)
- 修改棧頂指針, 指向新的棧頂元素。(S=S->next;)
- 釋放原棧頂元素的空間。(delete p;)

4.取棧頂元素
算法思想:當棧非空時, 此操作返回當前棧頂元素的值, 棧頂指針S保持不變。
6.判斷棧是否為空
算法思想:判斷棧頂指針即鏈表的頭指針是否指向空(S==NULL;)(這里不存在頭結點,所以不是判斷頭結點的指針域是否為空)
7.清空棧
算法思想:一個個刪除棧里的元素即出棧,直到棧為空(棧還存在)
8.銷毀棧
算法思想:一個個刪除棧里的元素即出棧,直到棧為空,最后再把棧頂指針指向的空間給釋放掉(棧不存在)
9.查看棧元素的個數
算法思想:再設置一個指向棧底元素的指針,兩個指針相減再加一就為棧元素個數,或者不另外設置指針,將棧頂指針向下挪,並設置同步計數變量,直至棧頂指針的指針域為空,返回計數變量的大小即為元素的個數。
10.遍歷棧
算法思想:設置一個指針p指向棧頂(和棧頂指針指向一致),不斷將p指針向下挪,同時打印p指針指向結點的數據域
代碼實現
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node* next;
}Node, * stack;
//初始化棧
void initialsatck(stack& s)
{
s = new Node;
s->next = NULL;
}
//判斷棧是不是空的
bool isempty(stack& s)
{
if (s== NULL)
{
cout << "棧不存在" << endl;
exit(0);
}
if (s->next == NULL)
{
return true;
}
return false;
}
//入棧
void push(stack& s, int e)
{
//先開辟一個空間存儲新的數據
Node* p = new Node;
p->data = e;
p->next = s->next;
s->next = p;
}
//出棧
int pop(stack& s)
{
if (isempty(s))
{
exit(1);
}
Node* p = s->next;
s->next = p->next;
int e = p->data;
delete p; //清空取出數據的空間
return e;
}
int getlength(stack& s) //取棧的地址,進行查看棧的長度
{
Node* p = s;
int length = 0;
while (p->next != NULL)
{
p = p->next;
length++;
}
return length;
}
//獲取棧頂元素
int gettop(stack& s)
{
if (isempty(s))
{
exit(1);
}
return s->next->data;
}
//清空棧
void clearstack(stack& s)
{
while (!isempty(s))
{
pop(s);
}
}
//銷毀棧
void destorystack(stack& s)
{
while (!isempty(s))
{
pop(s);
}
delete s;
s = NULL;
}
void print(bool b)
{
if (b)
cout << "yes" << endl;
else
cout << "no" << endl;
}
int main()
{
stack s;
initialsatck(s);
for (int i = 0; i < 12; i++)
{
push(s, i);
}
cout << getlength(s) << endl;
clearstack(s);
cout << getlength(s) << endl;
destorystack(s);
return 0;
}