数据结构-栈、队列和数组

顺序栈

Stack.c

//
// Created by jimeng on 2022/12/28.
//
#include <stdlib.h>
#include <stdio.h>
// 顺序栈
#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int top;
}SqStack;

// 初始化栈
SqStack* InitStack() {
    SqStack *stack = (SqStack*) malloc(sizeof(SqStack));
    stack->top = -1;
    return stack;
}

// 判断栈空
int StackEmpty(SqStack *stack) {
    if(stack->top == -1) {
        return 1;
    }
    return 0;
}

// 进栈
int Push(SqStack *stack, ElemType e) {
    if(stack->top == MaxSize-1) {
        return 0;
    }
    stack->data[++stack->top] = e;
    return 1;
}

// 出栈
int Pop(SqStack *stack, int *e) {
    if(stack->top == -1) {
        return 0;
    }
    *e = stack->data[stack->top--];
    return 1;
}

// 读栈顶元素
int GetTop(SqStack *stack, int *e) {
    if(stack->top == -1) {
        return 0;
    }
    *e = stack->data[stack->top];
    return 1;
}

// 销毁栈
int DestroyStack(SqStack *stack) {
    free(stack);
    return 1;
}

main.c

#include <stdio.h>
#include "Stack/Stack.c"

int main() {
    printf("Stack\n");
    SqStack *stack = InitStack();
    Push(stack,1);
    Push(stack,2);
    Push(stack,3);
    PrintStack(stack);
    int x = 0;
    Pop(stack, &x);
    printf("Pop: %d\n", x);
    GetTop(stack, &x);
    printf("GetTop: %d\n", x);
    return 0;
}

共享栈

链栈

LinkStack.c

//
// Created by jimeng on 22-12-28.
//
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LinkNode {
    ElemType data;
    struct LinkNode *next;
} LinkNode, *LinkStack;

// 初始化栈
LinkStack InitStack() {
    LinkNode *p;
    ElemType data;
    scanf("%d", &data);
    LinkNode *Lhead = NULL;
    while (data!=9999) {
        p = (LinkNode*) malloc(sizeof(LinkNode));
        p->next = Lhead;
        p->data = data;
        Lhead = p;
        scanf("%d", &data);
    }
    return Lhead;
}

//判断栈是否为空
int StackEmpty(LinkStack linkStack) {
    if(linkStack == NULL) {
        return 1;
    }
    return 0;
}

//进栈
LinkStack Push(LinkStack linkStack, ElemType e) {
    LinkNode *top = (LinkNode*) malloc(sizeof(LinkNode));
    top->next = linkStack;
    top->data = e;
    linkStack = top;
    return linkStack;
}

//出栈
LinkStack Pop(LinkStack linkStack, ElemType *e) {
    if(StackEmpty(linkStack) == 1) {
        return NULL;
    }
    LinkNode *top = linkStack;
    if(top!=NULL) {
        *e = top->data;
    }
    linkStack = linkStack->next;
    free(top);
    return linkStack;
}

//读取栈顶元素
int GetTop(LinkStack linkStack, ElemType *e) {
    *e = linkStack->data;
    return 1;
}

//打印栈
void PrintStack(LinkStack linkStack) {
    LinkNode *p = linkStack;
    printf("{ ");
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("}\n");
}

main.c 

#include "LinkStack/LinkStack.c"

int main() {
    LinkStack linkStack = InitStack();
    linkStack = Push(linkStack,666);
    PrintStack(linkStack);
    ElemType data;
    linkStack = Pop(linkStack, &data);
    PrintStack(linkStack);
    return 0;
}

队列

队列的顺序存储

#define MaxSize 50
typedef struct {
    int data[MaxSize];
    int front, rear;
}SqQueue;

 可能存在假溢出的情况

循环队列

初始时:front=rear = 0

队首指针进1:front= (front+1)%MaxSize

队尾指针进1:rear= (rear+1)%MaxSize

队列长度:(rear+MaxSize-front)%MaxSize

队满条件:(rear+1)%MaxSize==front

队空条件:front == rear

队列的链式存储

双端队列

栈和队列的应用

括号匹配

后缀表达式

数组和特殊矩阵

压缩存储:为多个值相同的元素只分配一个存储空间,队零元素不分配存储空间。目的是节省存储空间。

特殊矩阵:具有许多相同元素或零元素,并且这些元素分布有一定的规律性。常见的有对称矩阵、上下三角矩阵、对角矩阵。

 

 稀疏矩阵

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值