首页 > 其他分享 >数据结构-队列和栈

数据结构-队列和栈

时间:2023-11-06 23:23:53浏览次数:40  
标签:QNode 队列 top pop int 数据结构 stack rear

栈和队列是两种不同的数据形式,区别就是栈是先进后出,但是队列先进先出,可以用数据结构模拟这两种形式。

1、队列

完整代码如下:


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

#if 0 /*顺序队列*/
int enQueue(int *a, int rear, int data)
{
    a[rear] = data;
    rear++;
    return rear;
}

void deQueue(int *a, int front, int rear)
{
    while (front != rear)
    {
        printf("出队元素 %d\n", a[front]);
        front++;
    }
}

int main()
{
    int a[100];
    int front, rear;
    front = rear = 0;

    rear = enQueue(a, rear, 1);
    rear = enQueue(a, rear, 2);
    rear = enQueue(a, rear, 3);
    rear = enQueue(a, rear, 4);

    deQueue(a, front, rear);
    exit(0);
}
#else
typedef struct QNode
{
    int data;
    struct QNode *next;
}QNode;

QNode *initQueue()
{
    QNode *queue = (QNode*)malloc(sizeof(QNode));
    queue->next = NULL;
    return queue;
}

QNode *enQueue(QNode *rear, int data)
{
    QNode *enElme = (QNode*)malloc(sizeof(QNode));
    enElme->data = data;
    enElme->next = NULL;
    rear->next = enElme;
    rear = enElme;
    return rear;
}

QNode *DeQueue(QNode *top, QNode *rear)
{
    if(top->next == NULL)
    {
        printf("队列为空 \n");
        return rear;
    }

    QNode *p = top->next;
    printf("%d ", p->data);
    top->next = p->next;
    if(rear == p)
    {
        rear = top;
    }
    free(p);
    return rear;
}

int main()
{
    QNode *queue, *top, *rear;
    queue = top = rear = initQueue();

    rear=enQueue(rear, 1);
    rear=enQueue(rear, 2);
    rear=enQueue(rear, 3);
    rear=enQueue(rear, 4);
    //入队完成,所有数据元素开始出队列
    rear=DeQueue(top, rear);
    rear=DeQueue(top, rear);
    rear=DeQueue(top, rear);
    rear=DeQueue(top, rear);
    rear=DeQueue(top, rear);    
}

#endif

2、栈

完整代码如下:

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

#if 0 /*顺序栈*/
int push(int *a, int top, int elem)
{
    a[++top] = elem;
    return top;
}

int pop(int *a, int top)
{
    if(top == -1)
    {
        printf("空栈\n");
        return -1;
    }

    printf("弹栈元素:%d\n", a[top]);
    top--;
    return top;
}

int main()
{
    int a[100];
    int top=-1;
    top=push(a, top, 1);
    top=push(a, top, 2);
    top=push(a, top, 3);
    top=push(a, top, 4);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);

    exit(0);
}
#else /*链栈*/
typedef struct lineStack
{
    int data;
    struct lineStack *next;
}lineStack;

lineStack *push(lineStack *stack, int a)
{
    lineStack *line = (lineStack *)malloc(sizeof(lineStack));
    line->data = a;

    line->next = stack;
    stack = line;

    return stack;
}

lineStack *pop(lineStack *stack)
{
    if(stack)
    {
        lineStack *p = stack;
        stack = stack->next;
        printf("出栈元素 %d ", p->data);
        if(stack)
        {
            printf("新栈顶元素 %d\n", stack->data);
        }
        else
        {
            printf("栈空 \n");
        }
        free(p);
    }
    else{
        printf("栈已空 \n");
        return stack;
    }
    return stack;
}

int main() {
    lineStack * stack=NULL;
    stack=push(stack, 1);
    stack=push(stack, 2);
    stack=push(stack, 3);
    stack=push(stack, 4);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    return 0;
}

#endif

标签:QNode,队列,top,pop,int,数据结构,stack,rear
From: https://www.cnblogs.com/lx2035/p/17814051.html

相关文章

  • 数据结构-链表2
    1、静态链表这个给我的感觉就是数组加了索引,它的目的就是要融合顺序表和链表的优点,能够快速的访问元素,也能快速的增加或删除元素。整个的组成如图所示,第一列的数据是位置,第二列是数据2、双向链表双向链表概念是区别于单链表而言的,就是多了一个前驱,组成示意图如下所示:常见结......
  • 数据结构-队列
    一、概念1、队列的定义队列是仅限在一端进行插入,另一端进行删除的线性表。队列又被称为先进先出(FirstInFirstOut)的线性表,简称FIFO。2、队首允许进行元素删除的一端称为队首3、队尾允许进行元素插入的一端称为队尾二、接口1、可写接口(1)数据入队队列的插入操作,叫做入队。它是......
  • 单调队列学习笔记
    Menu单调队列(MonotonicQueue)简介代码模板例题单调栈(MonotonicStack)简介代码模板例题......
  • 数据结构
    数据的逻辑结构:线性逻辑结构:一对一除第一个和最后一个元素外,数据的每一个元素都有且只有一个直接前驱和一个直接后继树型逻辑结构:一对多有且只有一个称为根的数据元素;根没有前驱,其余的每个元素有且只有一个前驱,末端元素没有......
  • 【Java集合】数据结构与集合的神秘联系,一文读懂!
    上篇文章中我们对单列集合中常用的方法和遍历查询。通过本文章为我们解惑,好好的字符串用起来不就行了,为什么要用集合这些工具类?本篇文章将简要介绍数据结构,让读者了解它们在计算机中以何种结构方式存在。那么,什么是数据结构呢?下面我们来详细解释。数据结构1.1数据结构有什么用?......
  • 队列(阻塞队列、非阻塞队列)的详解
    队列的详解什么是队列?用来存储一条条消息(线程)的容器是一个对列。队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则什么是阻塞队列,什么是非阻塞队列?阻塞队列:添加元素时,超过总数则会进行等待(阻塞)。删除元素时,队列为空则会进行等待(阻塞)。非阻塞队列:不管什么情况下都......
  • 数据结构与算法-数组
    什么是数组在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据数组的特点低效的插入和删除数组为了保持内存数据的连续性,会导致插入......
  • 数据结构之排序
    一.什么是稳定排序?排序后相等元素的相对位置不发生变化二.稳定排序有哪些?2.1.不稳定排序:快速排序、希尔排序、堆排序2.2.稳定排序:冒泡排序、插入排序、归并排序、基数排序三.各大排序算法3.1.稳定算法3.1.1.冒泡排序思想:通过两两比较不断将最大的数浮出水面。一次浮出一......
  • 数据结构的基本概念和术语
    数据(Data)数据:能输入计算机且能被计算机处理的各种符号的集合,信息的载体能被计算机识别,存储和加工包括:数值型的数据:整数,实数等  非数值型的数据:文字,图像,声音等;2.数据元素和数据项数据元素:是数据的基本单位,在计算机程序......
  • 【MySQL】MVCC机制、ReadView数据结构、匹配规则详解
    (目录)MySQLMVCC机制1.隔离级别在MySQLInnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制)进行并发事务控制MVCC是**基于”数据版本”**对并发事务进行访问2.场景分析UNDO_LOG不是会被删除吗?中间数据万一被删了版本链不就断了?UNDO_LOG版本链不是立即删除,MySQL确保版......