栈和队列使用

一、栈

1、栈的介绍

        栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。在C语言中,栈并不直接内置,但可以通过数组或链表等数据结构来模拟栈的行为。

2、栈的构建与使用

        下面是利用C语言来完成初始化栈、判断栈空、判断栈满、入栈(push)、出栈(pop)和获取栈顶元素等操作

(2.1)初始化栈
//构建栈的结构体
#define MAX 100
typedef struct
{
    int data[MAX];//数据数组,也称为栈的容量
    int top;//栈顶,默认初始化为-1
}Stack;
//初始化栈
void stack_init(Stack *stack)
{
    stack->top=-1;
}
(2.2)判断栈是否为空或满
//判断是否为空
bool if_Null(Stack *stack)
{
    return stack->top==-1;//如果栈顶top等于-1则为真,栈空
}
//判断是否为满
bool if_Full(Stack *stack)
{
    return stack->top==MAX-1;//如果栈顶top等于(MAX-1),栈满
}
(2.3)入栈操作
bool Push(Stack *stack,int num)
{
    if(if_Full(stack))//判断栈是否满
        return false;
    stack->data[++(stack->top)]=num;//先改变top的大小再赋值
    return true;

}
(2.4)出战操作
bool Pop(Stack *stack,int *num)
{
    if(if_Null(stack))//判断栈是否为空
        return false;
    *num=stack->data[(stack->top)--];//先取值后改变栈顶大小
    return true;
}
(2.5)获取栈顶
bool Gotop(Stack *stack,int *num)
{
    if(if_Null(stack))
        return false;
    *num=stack->data[stack->top];//只取栈顶,不做其他任何操作
    return true;
}

3、栈的示例完整代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
//构建栈的结构体
#define MAX 100
typedef struct
{
    int data[MAX];//数据数组,也称为栈的容量
    int top;//栈顶,默认初始化为-1
}Stack;
//初始化栈
void stack_init(Stack *stack)
{
    stack->top=-1;
}
//判断是否为空
bool if_Null(Stack *stack)
{
    return stack->top==-1;//如果栈顶top等于-1则为真,栈空
}
//判断是否为满
bool if_Full(Stack *stack)
{
    return stack->top==MAX-1;//如果栈顶top等于(MAX-1),栈满
}
//入栈操作
bool Push(Stack *stack,int num)
{
    if(if_Full(stack))//判断栈是否满
        return false;
    stack->data[++(stack->top)]=num;//先改变top的大小再赋值
    return true;

}
//出栈操作
bool Pop(Stack *stack,int *num)
{
    if(if_Null(stack))//判断栈是否为空
        return false;
    *num=stack->data[(stack->top)--];//先取值后改变栈顶大小
    return true;
}
//获取栈顶
bool Gotop(Stack *stack,int *num)
{
    if(if_Null(stack))
        return false;
    *num=stack->data[stack->top];//只取栈顶,不做其他任何操作
    return true;
}
int main(int argc,char const *argv[])
{
    Stack stack;
    //初始化链表
    stack_init(&stack);
    //入栈
    Push(&stack,1);
    Push(&stack,2);
    Push(&stack,3);
    //出栈
    int num;
    Pop(&stack,&num);
    printf("%d",num);
    //取栈顶
    Gotop(&stack,&num);
    printf("%d",num);
}

二、队列

1、队列的介绍

        队列(Queue)是一种先进先出(FIFO, First In First Out)的线性数据结构。它只允许在队列的前端(front)进行删除操作,在队列的后端(rear)进行插入操作。

2、队列的构建和使用

(2.1)初始化队列
#define MAX 5  // 定义队列的最大容量

struct Queue {
    int items[MAX];
    int front;
    int rear;
};

// 初始化队列
void initQueue(struct Queue* q) {
    q->front = -1;
    q->rear = -1;
}
(2.2)判断队列是否为空或满
// 检查队列是否为空
int isEmpty(struct Queue* q) {
    return q->front == -1;
}

// 检查队列是否已满
int isFull(struct Queue* q) {
    return q->rear == MAX - 1;
}
(2.3)入队操作
// 入队操作
void enqueue(struct Queue* q, int value) {
    if (isFull(q)) {
        printf("队列已满,无法插入元素 %d\n", value);
    } else {
        if (q->front == -1)  // 如果队列为空,插入第一个元素时,设置front
            q->front = 0;
        q->rear++;
        q->items[q->rear] = value;
        printf("插入元素 %d\n", value);
    }
}
(2.4)出队操作
// 出队操作
int dequeue(struct Queue* q) {
    int item;
    if (isEmpty(q)) {
        printf("队列为空,无法出队\n");
        return -1;
    } else {
        item = q->items[q->front];
        q->front++;
        if (q->front > q->rear) {  // 如果队列为空,重置front和rear
            q->front = q->rear = -1;
        }
        return item;
    }
}
(2.5)显示队列所有元素
// 显示队列元素
void displayQueue(struct Queue* q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
    } else {
        printf("队列内容: ");
        for (int i = q->front; i <= q->rear; i++) {
            printf("%d ", q->items[i]);
        }
        printf("\n");
    }
}

3、队列的示例完整代码

#include <stdio.h>
#include <stdlib.h>

#define MAX 5  // 定义队列的最大容量

struct Queue {
    int items[MAX];
    int front;
    int rear;
};

// 初始化队列
void initQueue(struct Queue* q) {
    q->front = -1;
    q->rear = -1;
}

// 检查队列是否为空
int isEmpty(struct Queue* q) {
    return q->front == -1;
}

// 检查队列是否已满
int isFull(struct Queue* q) {
    return q->rear == MAX - 1;
}

// 入队操作
void enqueue(struct Queue* q, int value) {
    if (isFull(q)) {
        printf("队列已满,无法插入元素 %d\n", value);
    } else {
        if (q->front == -1)  // 如果队列为空,插入第一个元素时,设置front
            q->front = 0;
        q->rear++;
        q->items[q->rear] = value;
        printf("插入元素 %d\n", value);
    }
}

// 出队操作
int dequeue(struct Queue* q) {
    int item;
    if (isEmpty(q)) {
        printf("队列为空,无法出队\n");
        return -1;
    } else {
        item = q->items[q->front];
        q->front++;
        if (q->front > q->rear) {  // 如果队列为空,重置front和rear
            q->front = q->rear = -1;
        }
        return item;
    }
}

// 显示队列元素
void displayQueue(struct Queue* q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
    } else {
        printf("队列内容: ");
        for (int i = q->front; i <= q->rear; i++) {
            printf("%d ", q->items[i]);
        }
        printf("\n");
    }
}

int main() {
    struct Queue q;
    initQueue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);
    enqueue(&q, 40);
    enqueue(&q, 50);

    displayQueue(&q);

    printf("出队元素: %d\n", dequeue(&q));
    displayQueue(&q);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值