基础数据结构(2):栈

1.栈的定义

栈是仅限在表尾进行插入和删除的线性表,栈又被称为后进先出的线性表

1.1栈顶和栈底

栈是一个线性表,我们允许插入和删除的一端称为栈顶

栈底和栈顶相对,实际上栈底的元素不需要关心

1.2入栈和出栈

栈元素的插入操作叫做入栈,也可称为进栈、压栈

2.栈的特点

栈也是一种线性结构,栈只能从一端添加元素,也只能从这一端取出元素,向栈中添加元素的过程,称为入栈,从栈中取出元素的过程称为出栈

3.栈的链表实现

利用链表来模拟栈,每个栈元素可以用一个链表结点表示,data代表数据域,next代表指针域

复制代码
typedef struct StackNode
{
	int data;
	StackNode* next;
}StackNode;

stack表示栈,其中head指向栈顶,size代表栈中元素个数

复制代码
typedef struct Stack
{
	StackNode* head;
	int size;
}Stack;

3.1入栈和出栈

栈元素的插入操作叫做入栈,新建一个值为1的结点,并且将它指向栈顶,将它标记为新的栈顶

复制代码
void StackPushStack(Stack* stk, int dt)
{
	StackNode* vtx = (StackNode*)malloc(sizeof(StackNode));//首先生成一个栈元素结点
	vtx->next = stk->head;//将它的后继指向当前得到栈顶
	vtx->data = dt;//数据域为dt
	stk->head = vtx;//将vtx作为新的栈顶
	++stk->size;//对栈中元素计数加一
}

栈元素的删除操作叫做出栈,也可称为弹栈

复制代码
void StackPopStack(Stack* stk)
{
	StackNode* temp = stk->head;//将当前的栈顶元素存储在temp中
	stk->head = temp->next;//将新的栈顶指向栈顶的后继
	free(temp);//释放temp的内存
	--stk->size;//对栈中元素计数减一
}

3.2栈的遍历

想要输出栈内存储的所有元素,就要使用遍历

复制代码
void StackPrintStack(Stack* stk)
{
	while (stk->head != NULL)
	{
		printf("%d ", stk->head->data);
		stk->head = stk->head->next;
		stk->size--;
	}
}

3.3完整实现代码

复制代码
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode
{
	int data;
	StackNode* next;
}StackNode;
typedef struct Stack
{
	StackNode* head;
	int size;

}Stack;
void StackPushStack(Stack* stk, int dt)
{
	StackNode* vtx = (StackNode*)malloc(sizeof(StackNode));//首先生成一个栈元素结点
	vtx->next = stk->head;//将它的后继指向当前得到栈顶
	vtx->data = dt;//数据域为dt
	stk->head = vtx;//将vtx作为新的栈顶
	++stk->size;//对栈中元素计数加一
}
void StackPopStack(Stack* stk)
{
	StackNode* temp = stk->head;
	stk->head = temp->next;
	free(temp);
	--stk->size;
}
void StackPrintStack(Stack* stk)
{
	while (stk->head != NULL)
	{
		printf("%d ", stk->head->data);
		stk->head = stk->head->next;
		stk->size--;
	}
}
int main()
{
	Stack* stk = (Stack*)malloc(sizeof(Stack));
	stk->head =NULL;
	stk->size = 0;
	int x=0;
	scanf_s("%d", &x);
	while (x)
	{
		StackPushStack(stk,x);
		scanf_s("%d", &x);

	}
	StackPrintStack(stk);
	return 0;
}

运行结果:

4栈的数组实现

这里用到了C++,没学过的可以先只看链表实现

4.1入栈和出栈

数组模拟栈时用top表示栈顶所在的索引。初始化top=-1,表示没有元素

复制代码
const int N = 100010;
int stack[N];
int top = -1;
void StackPushStack(int stack[],int x)
{
	stack[++top]=x;
}

出栈时,使用pop函数,top向前移动一格,top--。

复制代码
void StackPopStack(int stack[])
{
   top--;
}

4.2获取栈顶的值

复制代码
stack[top];

4.3判断栈是否为空

如果top>0,则表示不为空

复制代码
if(top>0)
{

}

4.4完整代码实现

复制代码
#include<iostream>
using namespace std;
const int N = 100010;
int stack[N];
int top = -1;
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int x;
		cin >> x;
		stack[++top] = x;
	}
	for (int i = top-1;i>=0; i--)
	{
		cout << stack[i] << " " ;
	}
	cout << endl;
	top--;
	for (int i = top - 1; i >= 0; i--)
	{
		cout << stack[i] << " " ;
	}
	cout << endl;
	cout << stack[top] << endl;
	if (top > 0)
	{
		cout << "栈不为空" << endl;
	}
}
相关推荐
小年糕是糕手1 小时前
【C++】C++入门 -- inline、nullptr
linux·开发语言·jvm·数据结构·c++·算法·排序算法
聆风吟º2 小时前
【数据结构入门手札】算法核心概念与复杂度入门
数据结构·算法·复杂度·算法的特性·算法设计要求·事后统计方法·事前分析估算方法
vir023 小时前
密码脱落(最长回文子序列)
数据结构·c++·算法
福尔摩斯张3 小时前
二维数组详解:定义、初始化与实战
linux·开发语言·数据结构·c++·算法·排序算法
Samuel-Gyx4 小时前
数据结构--二叉树构造与遍历顺序的相互转化
数据结构
未若君雅裁4 小时前
斐波那契数列 - 动态规划实现 详解笔记
java·数据结构·笔记·算法·动态规划·代理模式
晨非辰7 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
星期天211 小时前
3.0 C语⾔内存函数:memcpy memmove memset memcmp 数据在内存中的存储:整数在内存中的存储 ⼤⼩端字节序和字节序判断
c语言·数据结构·进阶·内存函数·数据内存存储
fashion 道格15 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
j_xxx404_16 小时前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++