C++(CPP)栈的第二弹之链栈的基本操作(内含小白操作图解)

上篇我们学到了顺序栈,本篇我们一起来学习链栈。

点击查看:顺序栈传送门
点击查看:顺序表与链表的差别

链栈——采用链式存储的栈称为链栈。

顺序栈和链栈区别如下(同顺序表和链表):

  • 1、存储结构不同,顺序栈是静态分配的,而链栈则是动度态分配的,链栈可以将很多零碎的空问间利用起来,容量可答变,节省空间,顺序栈则固定内存空间,容量不变。
  • 2、顺序栈查询速度快,链栈添加删除容数据更快。

实现以链表的形式:将链表的头部作为栈顶,尾部作为栈底。
在这里插入图片描述
与链表的插入操作不同的是,链栈只能用头插法,栈的特点——先进后出。

1-基本操作图解:

①进栈操作

②出栈操作
C++(CPP)栈的第二弹之链栈的基本操作(内含小白操作图解)_第1张图片

2-代码的实现

init.h

#ifndef _INIT_H
#define _INIT_H
#define TRUE 1
#define FASLE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#include
#include
typedef int Status;
typedef char SElemType;
 
#endif

linkStack.h

#ifndef LINKSTACK_H
#define LINKSTACK_H
typedef struct SNode
{
     
	SElemType data;//数据域
	struct SNode * next;//指针域
}SNode, *LinkNode;

typedef struct
{
     
	LinkNode top;//栈顶指针
	int size;
}LinkStack;

Status InitLinkStack(LinkStack &LS);//构造一个空链栈

Status Push(LinkStack &LS,SElemType e);//进栈

Status Pop(LinkStack &LS,SElemType &e);//进栈

Status DisplayLinkStack(LinkStack LS);//打印栈

#endif

linkStack.cpp

#include"init.h"
#include"LinkStack.h"
#include 
using namespace std;

Status InitLinkStack(LinkStack &LS)//构造空栈
{
     
	LS.top = (LinkNode)malloc(sizeof(SNode));//栈顶指针申请存储空间
	LS.top->next = NULL;
	LS.size = 0;//空栈
	return OK;
}

Status Push(LinkStack &LS,SElemType e)//进栈
{
     
	LinkNode p = (LinkNode)malloc(sizeof(SNode));
	p->next = LS.top->next;
	LS.top->next = p;
	p->data = e;
	++LS.size;//栈长+1
	return OK;
}

Status Pop(LinkStack &LS,SElemType &e)//出栈
{
     
	if(LS.size == 0)//判空
	{
     
		cout<<"空栈";
		return ERROR;
	}
	e = LS.top->next->data;//栈顶下一个指针的数据域
	LinkNode p = LS.top->next;
	LS.top->next = LS.top->next->next;
	--LS.size;//栈长-1
	free(p);//释放指针p的空间
	return OK;
}

Status DisplayLinkStack(LinkStack LS)//打印栈
{
     
	LinkNode p;
	p = LS.top->next;
	while(p)
	{
     
		cout<<p->data;
		p = p->next;
	}
	cout<<endl;
	return OK;
}

main.cpp

#include"init.h"
#include"LinkStack.h"
#include 
using namespace std;

void TestLinkStack()
{
     
	LinkStack S;
	InitLinkStack(S);
	Push(S,'i');
	Push(S,'k');
	Push(S,'o');
	Push(S,'l');
	Push(S,'y');
	Push(S,'y');
	Push(S,'y');
	cout<<"栈中的元素为:"<<endl;
	DisplayLinkStack(S);
	SElemType e;
	Pop(S,e);
	cout<<"出栈的元素为:"<<e;
}
int main()
{
     
	TestLinkStack();
	return 0;
	system("pause");
}

运行:
C++(CPP)栈的第二弹之链栈的基本操作(内含小白操作图解)_第2张图片

资料:严蔚敏《数据结构(C语言版)》

此次的数据结构分享就到这里,欢迎大家指导指正~ 我是爱吃肉的小白yyyloki,如果你觉得不错的话点个赞吧!我们下次见~886

C++(CPP)栈的第二弹之链栈的基本操作(内含小白操作图解)_第3张图片

今天也是充满“血与泪”的一天,小伙伴们不要跟我一样把文件存的乱七八糟,不然就会被拒绝访问

你可能感兴趣的:(数据结构,链表,数据结构,栈)