思想:
跟06上章对比,链表实现结构类同,都是用到了企业小挂钩的写法。这里的区别就是顺序存储用到的是数组方式存储,其用数组尾部进行增删栈操作。而这里的链式储存是用链表头部进行增删栈操作的。
栈:先进后出,后进先出。
代码实现
头文件.h
#pragma once
#include <iostream>
using namespace std;
//运用企业链表构建
typedef struct SNode {
struct SNode *next;
}Snode;
typedef struct LinkStack {
int size;
Snode head;//小挂钩
}Lstack;
//初始化
Lstack* init_Lstack();
//增加
void push_Lstack(Lstack * Lsta,int pos,Snode* data);
//删除
void pop_Lstack(Lstack* Lsta);
//返回栈顶元素
Snode* Top_Lstack(Lstack* Lsta);
//摧毁内存
void free_Lstack(Lstack* Lsta);
//返回栈的大小
int Size_Lstack(Lstack* Lsta);
.cpp文件
#include "LinkStack.h"
Lstack* init_Lstack()
{
Lstack* lsta = (Lstack*)malloc(sizeof(Lstack));
lsta->size = 0;
lsta->head.next= NULL;
return lsta;
}
void push_Lstack(Lstack* Lsta,int pos,Snode *data)
{
if (Lsta==NULL) {
cout<<"链表未被创建!" << endl;
}
Snode* pre = &(Lsta->head);
for (int i = 0;i<pos;i++) {
pre = pre->next;
}
Snode* pcur = pre->next;
data->next = pcur;
pre->next = data;
Lsta->size++;
}
void pop_Lstack(Lstack* Lsta)
{
if (Lsta == NULL) {
cout << "链表未被创建!" << endl;
}
Snode* first = Lsta->head.next;
Lsta->head.next = first->next;
Lsta->size--;
}
Snode* Top_Lstack(Lstack* Lsta)
{
return Lsta->head.next;
}
void free_Lstack(Lstack* Lsta)
{
if (Lsta == NULL) {
cout<<"链表未被创建!" << endl;
}
free(Lsta);
cout<<"链表已被摧毁!" << endl;
}
int Size_Lstack(Lstack* Lsta)
{
return Lsta->size;
}
主函数测试文件
#include "LinkStack.h"
#define N 5
typedef struct M_num {
Snode node;
int num;
}NUM;
int main() {
NUM num[5];
for (int i = 0;i<N;i++ ) {
num[i].num = i;
}
Lstack* Lsta = init_Lstack();
for (int i = 0; i < N; i++) {
push_Lstack(Lsta, 0, (Snode*)&num[i]);
}
cout << "出栈前,栈的大小为:" << Size_Lstack(Lsta) << endl;
cout<<"栈的出栈顺序分别为:" << endl;
while (Lsta->size!=0) {
Snode* node = Top_Lstack(Lsta);
NUM* top = (NUM*)node;
cout << top->num <<" ";
pop_Lstack(Lsta);
}
cout<<"\n出栈后,栈的大小为:"<<Size_Lstack(Lsta) << endl;
free_Lstack(Lsta);
return 0;
}
运行效果