07数据结构—栈的链式储存

思想:

跟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;
}

运行效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值