栈和队列的插入、删除等基本操作

栈和队列

  • 栈:是一种特殊的线性表,其只允许在其固定的一段进行插入或者删除元素等操作;进行插入或者删除的一段称为栈顶,另一端称为栈顶;

  • 栈的特性:

    先进先出
    后进后出

栈的构造(C语言实现)
1. 静态栈的构造(栈的容量不能改变)
2. 动态栈的构造(栈的容量可以改表)
//静态栈的构造就是定义一个静态的顺序表
typedef struct Stack {
        int array[100];
       int size;

} Stack;

//动态栈的构造
typedef int STDataType; 

typedef struct Stack {
        STDataType* _a;
        int _top; // 栈顶
        int _capacity;  // 容量
}Stack;


栈的初始化与销毁
  1. 栈的初始化
void StackInit(Stack* s) {
        s->size = 0;
}
  1. 栈的销毁
void StackDestory(Stack* s){
    s->size = 0;
}
栈的插入、删除、返回栈顶元素、栈内元素个数、检查栈是否为空栈
  1. 栈的插入也叫入栈
//插入

void StackPush(Stack* s,int v) {
        s->array[s->size++] = v;
}
  1. 栈的删除也叫弹栈或者出栈
void StackPop(Stack* s,int v) {
        s->size--;
}

3.获取栈顶元素

/返回栈顶的数据,不需要删除栈顶的数据

int StsckTop(Stack* s) {
        return s->array[s->size - 1];
}

4.获取栈内元素个数

//返回栈内数据个数

int StackSize(Stack* s) {
        return s->size;
}

5.检查栈是否为空栈;(返回0表示空栈)

//返回栈内是否为空栈
//返回0:代表不是空;返回非0:表示为空

int StackEmpty(Stack* s) {
        return !s->size;
}

队列

  • 队列:只允许在一端进行插入数据操作操作 ,在另一端进行删除数据操作的特殊线性表;进行插入数据的一端叫队尾,进行删除一端叫队头;
  • 特性:先进先出,后进后出
  • 队的实现:队列也可以用数组或者链表实现;使用链表的结构实现会更优一些;因为使用数组结构在出队列是在数组的头上出数据,效率会更低;
队列的构造(用链表实现)
//链表节点的结构体
typedef struct Node {
        int value;
        struct Node* next;
} Node;

//队列的构造
typedef struct Queue {
        Node* head;  //队头
        Node* last;  //队尾
} Queue;
队列的初始化与销毁
//初始化
void QueueInit(Queue* q) {
       q->head = q->last = NULL;
}

//队列的销毁
void QueueDestroy(Queue* q) {
        Node *cur, *next;
        for (cur = q->head; cur != NULL; cur = next) {
               next = cur->next;
               free(cur);
        }
        q->head = q->last = NULL;
}
队列的入队、出对、获取队列首元素、获取队列大小、判断队列是否为空
  • 队列的入队(尾插)
void QueuePush(Queue* q,int v){ 
        Node* node= (Node*)malloc(sizeof(Node));
        node->value = v;
        node->next = NULL;
        if (q->head == NULL) {
               q->head = node;
               q->last = node;
        }
        else {
              q->last->next = node;
               q->last = node;
        }
}
  • 删除队列的头一个数据(头删)
void QueuePop(Queue* q) {
        Node* second = q->head->next;
        free(q->head);
        q->head = second;

        //last也有可能需要变更
        if (q->head == NULL) {
              q->head == NULL;
        }
}
  • 获取队列的首元素
//返回队列首元素

int QueueFront(Queue* q) {
       return q->head->value;
}
  • 获取队列的大小
int  QueueSize(Queue* q) {
        int size = 0;
        for (Node* cur = q->head; cur != NULL; cur = cur->next) {
               size++;
        }
        return size;
}
  • 判断队列是否为空
//判断队列是否为空
int QueueEmpty(Queue* q) {
        if (q->head == NULL) {
               return -1;
        }
        else {
               return 0;
        }
}
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值