数据结构(栈和队列)

//特殊的线性表 栈和列队

//栈 插入和删除受到一定限制的线性表

// 只能从一端插入 删除 特点 先进后出

//栈的插入操作 入栈\压栈

//栈的删除操作 出栈\弹栈

//插入和删除的一端是栈顶 另一端是栈底

#include<stdio.h>

#include<assert.h>

#include "Seqlist.h"

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include "SeqStack.h"

//初始化函数

void Init_SeqStack(SeqStack* psq)

{

assert(psq != NULL);

psq->base =(ELRMTYPE*) malloc(STACK_INIT_SIZE * sizeof(ELRMTYPE));

if (psq->base == NULL)

exit(EXIT_FAILURE);

psq->top = 0;

psq->stacksize = STACK_INIT_SIZE;//STACK_INIT_SIZE 本质是10;

/* assert(psq != NULL);*/

/* psq->base = (ELRMTYPE*)malloc(STACK_INIT_SIZE * sizeof(ELRMTYPE));

if (psq->base == NULL)

exit(EXIT_FAILURE);

psq->top = 0;

psq->stacksize = STACK_INIT_SIZE;*/

/* assert(psq != NULL);

psq->base = (ELRMTYPE*)malloc(STACK_INIT_SIZE * sizeof(ELRMTYPE));

if (psq->base == NULL)

exit(EXIT_FAILURE);

psq->top = 0;

psq->stacksize = STACK_INIT_SIZE;*/

}

//2 入栈

bool Push(SeqStack* psq, ELRMTYPE val)

{

assert(psq != NULL);

// 1. 先判断栈是否已满(栈满不能入栈)

if (psq->top == psq->stacksize )

Increase(psq);

// 2. 把元素存入栈顶

psq->basepsq-\>top = val;

// 3. 栈顶指针先上移一位

psq->top++;

// 4. 入栈成功

return true;

/* assert(psq != NULL);

if (psq->top == psq->stacksize)

Increase(psq);

psq->basepsq-\>top = val;

psq->top++;

return true;*/

/* assert(psq != NULL);

if (psq->top == psq->stacksize)

Increase(psq);

psq->basepsq-\>top = val;

psq->top++;

return true;*/

}

//3 出栈

bool Pop(SeqStack* psq)

{

assert(psq != NULL);

if (psq->top == 0)

return false;

psq->top--;

/* assert(psq!=NULL);

if (psq->top == 0)

return false;

psq->top--;*/

/*assert(psq != NULL);

if (psq->top == 0)

return false;

psq->top--;*/

}

//4 获取栈顶元素值(只瞄一眼栈顶的最新元素是是多少,别动他)

ELRMTYPE Top(const SeqStack* psq)

{

assert(psq != NULL);

if (psq->stacksize == NULL)

return false;

return psq->basepsq-\>top-1;

/* assert(psq != NULL);

if (psq->stacksize == NULL)

return false;

return psq->basepsq-\>top - 1;*/

/* assert(psq != NULL);

if (psq->stacksize == NULL)

return false;

return psq->basepsq-\>top - 1;*/

}

//5 扩容

void Increase(SeqStack* psq)

{

ELRMTYPE* tmp = (ELRMTYPE*)realloc(psq->base, psq->stacksize * sizeof(ELRMTYPE)*2);

psq->base = tmp;

psq->stacksize = psq->stacksize*2;

/* ELRMTYPE* tmp = (ELRMTYPE*)realloc(psq->base, psq->stacksize * sizeof(ELRMTYPE) * 2);

psq->base = tmp;

psq->stacksize = psq->stacksize * 2;*/

}

//6 判空

bool Empty(SeqStack* psq)

{

assert(psq != NULL);

return psq->stacksize == 0;

/* assert(psq != NULL);

return psq->stacksize == 0;*/

}

//7 判满

bool Full(SeqStack* psq)

{

assert(psq != NULL);

psq->top == psq->stacksize ;

/* assert(psq != NULL);

psq->top == psq->stacksize;*/

}

//8 打印

void show(SeqStack* psq)

{

assert(psq != NULL);

for (int i = 0; i < psq->stacksize; i++)

{

printf("%d", psq->basei);

}

printf("\n");

/*assert(psq != NULL);

for (int i = 0; i < psq->stacksize; i++)

{

printf("%d", psq->basei);

}

printf("\n");*/

}

//9 清空

void Clear(SeqStack* psq)

{

assert(!Empty);

psq->top=0;

}

//10 销毁

void Destroy(SeqStack* psq)

{

assert(psq != NULL);

free(psq->base);

psq->base = NULL;

psq->top = 0;

psq->stacksize = 0;

//assert(psq != NULL);

//free(psq->base);

//psq->base = NULL;

//psq->top = 0;

//psq->stacksize = 0;

}

//

#pragma once

//队列 受到限制的线性表

//只不过和栈受到的限制不一样 栈 只能在表尾进行插入和删除 队列只能在一端进行插入 一端进行删除 先进先出

// 入队与出队

//插入数据的一端叫队尾 删除数据的一端叫队首

//链式队列 头插入 尾删除 (用这个)头删除 尾插入

typedef int ELEMTYPE;

//链式队列的有效节点设计

typedef struct LQNode

{

ELEMTYPE data;

struct LQNode* next;

}LQNode;

//链式队列的辅助节点现在发现需要俩个指针 需单独设计

typedef struct Link_Quene

{

LQNode* front;//保存第一个有效节点的地址

LQNode* rear;//保存最后一个有效节点的地址

}Link_Quene;

//1初始化

void Init_Link_Quene(Link_Quene*pls);

//2入队

bool Push(Link_Quene* pls, ELEMTYPE val);

//3出栈

bool Pop(Link_Quene* pls);

//4获取栈顶元素

ELEMTYPE Top(Link_Quene* pls);

//5判空

bool Empty(Link_Quene* pls);

//6打印

void Show(Link_Quene* pls);

//7销毁

void Destroy(Link_Quene* pls);

//8获取队列有效元素的个数

int Get_Size(Link_Quene* pls);

#include<assert.h>

#include "Seqlist.h"

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include "Link_Quene.h"

#include<stdio.h>

//1初始化

void Init_Link_Quene(Link_Quene* pls)

{

pls->front = NULL;

pls->rear = NULL;

//pls->front = NULL;

//pls->rear = NULL;

}

//2入队

bool Push(Link_Quene* pls, ELEMTYPE val)

{

assert(pls != NULL);

LQNode* pnewnode = (LQNode*)malloc(1 * sizeof(LQNode));

pnewnode->data = val;

pnewnode->next = NULL;

if (Empty(pls))

{

pls->front = pls->rear = pnewnode;

return true;

}

LQNode* p = pls->rear;

pnewnode->next = p;

p->next = pnewnode;

//更新队尾节点

pls->rear = pnewnode;

/*assert(pls != NULL);

LQNode* pnewnode=(LQNode*)malloc(1 * sizeof(LQNode));

pnewnode->data = val;

pnewnode->next = NULL;

if (Empty(pls))

{

pls->front = pls->rear = pnewnode;

return true;

}

LQNode* p = pls->rear;

pnewnode->next = p;

p->next = pnewnode;

pls->rear = pnewnode;*/

}

//3出栈

bool Pop(Link_Quene* pls)

{

assert(pls != NULL);

if (Empty(pls))

return false;

LQNode* q = pls->front;

if (q->next==NULL)

{

free(q);

q = NULL;

pls->front = pls->rear = NULL;

return true;

}

else {

pls->front = q->next;

free(q);

q = NULL;

}

return 1;

}

//4获取栈顶元素

ELEMTYPE Top(Link_Quene* pls)

{

assert(pls != NULL);

assert(pls->front != NULL);

if (Empty(pls))

return false;

return pls->front->data;

}

//5判空

bool Empty(Link_Quene* pls)

{

assert(pls != NULL);

return pls->front = NULL;

}

//6打印

void Show(Link_Quene* pls)

{

assert(pls != NULL);

LQNode* p = pls->front;

for(;p!= NULL; p=p->next)

printf("%d\n", p->data);

}

//7销毁

void Destroy(Link_Quene* pls)

{

while (!Empty)

{

Pop(pls);

}

//LQNode* p = pls->front;

//LQNode* q = NULL;

//while (p != pls->rear)

//{

// q = p->next;

// free(p);

// p = q;

//}

}

//8获取队列有效元素的个数

int Get_Size(Link_Quene* pls)

{

assert(pls != NULL);

int num = 0;

LQNode* p = pls->front;

for (; p->next != pls->rear; p = p->next)

num++;

return num;

}

相关推荐
兰令水5 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25016 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
米尔的可达鸭9 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana29 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
Frostnova丶10 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面11 小时前
顺序表的按值查找
数据结构·c++·算法
延凡科技11 小时前
延凡科技 - 发生器设备管理控制系统:AI 驱动的全生命周期智能管控方案
大数据·数据结构·人工智能·算法
小肝一下12 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~13 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石13 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构