链栈是使用链表存储结构实现的栈,一种操作受限的线性表。节点组成元素与链表是一样的,这里的链表使用单链表,由于栈只能在一端进行操作,所以使用双链表是比较多余的。只需要一个指针top作为栈顶指针。注意一下,链栈一般是不带头节点的,这个地方需要和单链表区分开
#include <iostream>
using namespace std;
struct Node {
Node* next;
int data;
};
Node* top;//栈顶指针
bool empty() {
return top == NULL;//栈一般没有头节点
}//当top指针为空时表示空栈
Clear()函数实现流程
Clear()函数跟单链表里的Clear()是一样的,用迭代法删除所有节点。
- 新建指针p
- top指针非空: 1、p指向top所指 2、top移动到右侧节点 3、p指针删除所指对象
void Clear() {
Node* p;
while (top != NULL) {
p = top;//p首先指向top所指
top = top->next;//top移向下一节点
delete p;//p将原节点删除
}
cout << "链栈已清空" << endl;
}
Size()函数实现流程
通过临时指针遍历链栈,求栈长度。
- 创建一个临时指针p指向top所指
- 创建一个计数变量count
- while循环,当p不指向NULL时执行;每次计数变量+1,p指向右一节点
- 最后返回计数变量值
int Size() {//获取栈长度的函数
Node* p = top;//临时指针p指向top所指
int count = 0;//用于计数的变量
while (p!=NULL) {//只要p不指向空,就继续循环
count++;
p = p->next;//指针p移动到下一个节点
}
cout << "栈长度为: " <<count<< endl;
return count;//返回最终计数值
}
Push()函数实现流程
- 先开辟一块新节点,完成节点的赋值工作
- 然后新节点指向上一个节点的地址(就是top指针指向的地方)
- 然后top指针再指向新的节点
void Push(int value) {//传入一个值
Node* p = new Node();//用p接受新开辟的堆区内存
cout << "压入 " << value << endl;
p->data = value;//传入的值赋给新节点
p->next = top;//p指向节点的next指向top所指
top = p;
}
Pop函数实现流程
- 判断是否空栈
- 创建临时指针p,p指向top所指
- 访问p指向节点的数据
- top指针指向右一节点
- 用p删除原来的节点
int Pop() {
if (empty()) {//空栈检测
cout << "栈空,无数据可弹出" << endl;
return 0;
}
Node* p = top;//临时指针p指向top所指
int value = p->data;
top = top->next;//top指针移至下一位
delete p;//用临时指针删除对象
cout << "弹出 " << value << endl;
return value;//返回节点值
}
GetTop函数实现流程
- 判断是否为空栈
- 非空栈情况用top指针访问指向节点的数据
int GetTop() {
if (empty()) {//空栈检测
cout << "栈空,无数据" << endl;
return 0;
}
cout << "栈顶元素值为 " <<top->data<<endl;
return top->data;//返回top指向的节点值
}
测试用代码,懒得手敲可以直接搬走
int main() {
Push(3);
Push(2);
Push(87);
Push(134);
Pop();
Pop();
Clear();
Pop();
Push(57);
GetTop();
}