栈和队列的初始化,插入,删除,销毁。

目录

题外话

顺序表和链表优缺点以及特点

一.栈的特点

[二. 栈的操作](#二. 栈的操作)

2.1初始化

[2.2 栈的销毁](#2.2 栈的销毁)

[2.3 栈的插入](#2.3 栈的插入)

[2.3 输出top](#2.3 输出top)

[2.4 栈的删除](#2.4 栈的删除)

[2.5 输出栈](#2.5 输出栈)


题外话

顺序表和链表优缺点以及特点

特点:顺序表,逻辑地址=物理地址。可以任意访问,访问时间复杂度O(1).。实现分配空 间,当空间不足时,要动态扩容。顺序表在销毁时可以直接free,但链表要一 个个删 除。

链表:不连续的空间靠指针指向下一个地址。不用实现分配空间。

优缺点:

顺序表:适和访问,不适合插入删除,时间负责度为O(N)。链表适和插入删除操 作。

一.栈的特点

(1)先进后出

(2)栈不能任意打印,栈只能访问栈顶

(3)栈只能尾插头删

二. 栈的操作

2.1初始化

cpp 复制代码
void STInit(ST* pst) 
{
	assert(pst);
	pst->a = NULL;
	pst->top = -1;
	pst->capacity = 0;
}

2.2 栈的销毁

2.3 栈的插入

注意:🤖

如果你初始化为0,那么就是先插入在++;

如果你初始化为-1,那就是先++,在插入。

cpp 复制代码
}
//插入
void STPush(ST* pst, STDataType x) 
{
	assert(pst);
	if (pst->top == pst->capacity-1)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL) 
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->top++;
	pst->a[pst->top] = x;
}

2.3 输出top

注意:

由于栈的特性,只能先进先出,尾插头删,不能任意输出,所以我们只能输出头。

cpp 复制代码
void STTop(ST* pst) 
{
	assert(pst);
	assert(pst->top >= -1);
	return pst->a[pst->top];
}

2.4 栈的删除

cpp 复制代码
//删除
void STPop(ST* pst) 
{
	assert(pst);
	assert(pst->top>=-1);
	pst->top--;

2.5 输出栈

cpp 复制代码
while (STEmpty(&st) != true) {
	printf("%d ", STTop(&st));
	STPop(&st);
}

栈的完整代码

cpp 复制代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>


typedef int STDataType;
typedef struct STack
{
	STDataType* a;	//数值的指针是下标
	int top;
	int capacity;
}ST;

void STInit(ST* pst);
void STDestory(ST* pst);
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);
STDataType STTop(ST* pst);



#include"Stack.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

void STInit(ST* pst) 
{
	assert(pst);
	pst->a = NULL;
	pst->top = -1;
	pst->capacity = 0;
}
void STDestory(ST* pst) 
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top = -1;
	pst->capacity = 0;
	
}
//插入
void STPush(ST* pst, STDataType x) 
{
	assert(pst);
	if (pst->top == pst->capacity-1)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL) 
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->top++;
	pst->a[pst->top] = x;
}
//输出头结点
STDataType STTop(ST* pst) 
{
	assert(pst);
	assert(pst->top >= -1);
	return pst->a[pst->top];
}
//删除
void STPop(ST* pst) 
{
	assert(pst);
	assert(pst->top>=-1);
	pst->top--;
}
bool STEmpty(ST* pst) 
{
	assert(pst);
	if (pst->top == -1) {
		return true;
	}
	else {
		return false;
	}
}
int STSize(ST* pst) 
{
	assert(pst);
	return pst->top;
}




#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"

void Test1() {
	ST st;
	STInit(&st);
	STPush(&st, 1);
	STPush(&st, 2);
	STPush(&st, 3);
	STPush(&st, 4);
	printf("%d\n", STTop(&st));
	STPop(&st);
	printf("%d\n", STTop(&st));
	while (STEmpty(&st) != true) {
		printf("%d ", STTop(&st));
		STPop(&st);
	}
		
}

int main() 
{
	Test1();
	return 0;
}
相关推荐
梦帮科技1 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
泯泷1 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm1 小时前
34 合并K个升序链表
javascript·算法·链表
C++ 老炮儿的技术栈2 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
Navigator_Z3 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚5 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木5 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
是隼人5 小时前
buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
这料鬼有毒7 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃7 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm