持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
基础知识
-
栈
- 定义:栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
- 实现:栈的实现分为:顺序栈(数组实现)和链式栈(链表实现)
- 应用:在计算机组成中,栈在控制程序运行中的数据输入输出顺序具有重要作用。比如:栈在程序的运行中,保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。
- 存储形式:顺序存储、链式存储
- 常见的操作:入栈、出栈、计算节点数量、...
-
链栈
- 链栈是采用链式存储结构实现的“栈“,它是一种数据存储结构,可以通过单链表的方式来实现
使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
题目
栈的链式存储结构
实现
(1)用随机函数生成10个3位整数(100~999),把这些整数应用入栈操作存于堆栈中,在入栈接口处设置断点①,按“F5”启动调试,按“F10”逐句执行,直到数据全部入栈。程序暂停时观察栈顶数据和栈顶位置;
(2)应用出栈操作输出堆栈的内容,在出栈接口处设置断点②,按“F5”启动调试,按“F10”逐句执行,直到所有数据完全出栈,程序暂停时观察栈顶数据和栈顶位置的变化;
思路
① 通过定义一个class类StackNode,表示链表的结点;
② 通过定义一个class类LinkStack表示各种链表,封装了对链表的各种操作:
③ 具体实现操作在main()函数中调用执行
代码
#include <iostream>
#include <ctime>
using namespace std;
class StackNode
{
public:
StackNode():data(-1),next(NULL){}
StackNode(int m_data,StackNode *m_next=NULL):data(m_data),next(m_next){}
~StackNode() { next = NULL; }
int data;
StackNode *next;
};
class LinkStack
{
public:
LinkStack():p(NULL),len(0) {}
~LinkStack() {
StackEmpty();
}
void StackEmpty(); //栈清空
void Push(int m_data); //入栈
int Pop(); //出栈
public:
StackNode * p; //空栈
int len;
};
void LinkStack::StackEmpty()
{
while (p != NULL)
{
StackNode* tmp = p;
p = p->next;
delete tmp;
}
}
void LinkStack::Push(int m_data)
{
StackNode* p_new = new StackNode(m_data);
p_new->next = p;
p = p_new;
cout << "整数" << m_data << "入栈成功!" << endl;
len++;
cout << "当前链栈为:";
StackNode* q = p;
cout << "Start->"<<q->data;
for (;;)
{
if (q->next != NULL) {
cout << "->" << q->next->data;
q = q->next;
}
else break;
}
cout << "->End" << endl;
}
int LinkStack::Pop()
{
if (p == NULL) {
cout << "此链栈为空,无法执行出栈操作!" << endl;
return -1;
}
int e = p->data; //取栈顶元素
StackNode *tmp = p;
p = p->next; //指针移到栈顶的下一个结点
cout << "整数" << e << "出栈成功" << endl;
len--;
delete tmp; //释放栈顶空间
if (p != NULL)
{
cout << "当前链栈为:";
StackNode* q = p;
cout << "Start->" << q->data;
for (;;)
{
if (q->next != NULL) {
cout << "->" << q->next->data;
q = q->next;
}
else break;
}
cout << "->End" << endl;
}
return e;
}
int main()
{
time_t t; //随机种子由时间确定
srand((unsigned)time(&t));
LinkStack Slist; //定义一个单链表
for (int i = 1; i <= 10; i++) //生成10个随机整数存入链表
{
Slist.Push(rand() % 900 + 100); //插入到位置i100-999随机整数
}
while (Slist.len != 0)
{
Slist.Pop();
}
}