数据结构之----栈(堆栈),队列,堆

1.栈
栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈是LIFO(Last In First Out),先存进去的数据只能最后被取出来,进出顺序逆序,即先进后出,后进先出
在这里插入图片描述在这里插入图片描述
(1)栈的一些常用操作
创建栈

tack InitStack() {
Stack S = (Stack)malloc(sizeof(struct Node));//构造一个空栈
if (S == NULL) {
printf(“failed\n”);
return NULL;
}
S->next = NULL;
return S;
}

销毁栈

void DestoryStack(Stack &S) {
if (S != NULL) {
makeEmpty(S);
ptrToNode ptr = S;
free(ptr);
S = NULL;
}
}

清空栈

void DestoryStack(Stack &S) {
if (S != NULL) {
makeEmpty(S);
ptrToNode ptr = S;
free(ptr);
S = NULL;
}
}

进栈

void push(Stack S, Element e) {
if (S != NULL) {
ptrToNode ptr = (ptrToNode)malloc(sizeof(struct Node));
ptr->data = e;
ptr->next = S->next;
S->next = ptr;
}
else {
printf(“please create stack\n”);
}
}

出栈

void pop(Stack S) {
if (S == NULL) {
printf(“please create stack\n”);
return;
}
if (!isEmpty(S)) {
ptrToNode ptr = S->next;//将栈下一个元素提取出来
S->next = ptr->next;//将下下一个元素的值赋给下一个元素
free(ptr);
}
else {
printf(“the stack is empty”);
}
}

获取栈顶元素

Element top(Stack S) {
if (S == NULL) {
printf(“create stack\n”);
return NULL;
}
if (!isEmpty(S))
{
return S->next->data;
}
return 0;
}

获取栈的大小

int StackLength(Stack S) {
//ptrToNode ptr;
Stack a = S;
int i=0;
if (S == NULL) {
printf(“please create stack\n”);
return 0;
}
while (a->next != NULL) {
i++;
a = a->next;
}
return i;
}

部分测试代码

//stack.h
#pragma once
struct Node;
typedef struct Node *ptrToNode;
typedef struct Node *Stack;
typedef int Element;
struct Node {
Element data;//添加栈的数据
ptrToNode next;//指向栈下一节点
};
//创建栈
ptrToNode InitStack();
//计算栈的长度
int StackLength(Stack S);
//判断栈是否为空
int isEmpty(Stack S);
//出栈
void pop(Stack S);
//入栈
void push(Stack S, Element e);
//清空栈
void makeEmpty(Stack S);
//返回栈顶元素
Element top(Stack S);
//销毁栈
void DestoryStack(Stack &S);

//测试代码
#include<stdio.h>
#include<stdlib.h>
#include “stack.h”
int main() {
Stack S = InitStack();
push(S, 5);
push(S, 3);
push(S, 0);
push(S, 4);
push(S, 9);
printf(“栈元素长:%d个\n”, StackLength(S));
for (int i = 0; i < 5; i++) {
printf(“返回第:%d个栈顶元素:%d\n”,i+1,top(S));
pop(S);
}
DestoryStack(S);
system(“pause”);
return 0;
}

2.队列

队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表。允许插入的一端称为队尾Rear,允许删除的一端称为队头Front。 队列是FIFO(First In First Out),它保持进出顺序一致,即先进先出,后进后出在这里插入图片描述
注:常见的一些调试错误
0xCDCDCDCD - Created but not initialised 未初始化的堆内存

0xDDDDDDDD - Deleted 引用的内存已经/对象被删除

0xFEEEFEEE - Freed memory set by NT’s heap manager

0xCCCCCCCC - Uninitialized locals in VC6 when you compile w/ /GZ 未初始化的栈内存

0xABABABAB- Memory following a block allocated by LocalAlloc()

3.堆
堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通常可以被看做是一棵树的数组对象。
堆需要满足一下两个性质:
(1)堆中某个节点的值总是不大于或不小于其父节点的值;
(2)堆总是一棵完全二叉树。在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页