banner
NEWS LETTER

栈与队列

Scroll down

顺序栈

  • 结构定义

    1
    2
    3
    4
    5
    6
    #define Stack_Size 1024

    typedef struct {
    StackElementType elem[Stack_Size]; /*用来存放栈中元素的一维数组*/
    int top; /*用来存放栈顶元素的下标,top为-1表示空栈*/
    } SeqStack, Stack, *StackPtr;
  • 初始化

    1
    2
    3
    void InitStack(StackPtr *S) {
    (*S)->top = -1; //栈顶指针置为空
    }
  • 进栈

    1
    2
    3
    4
    5
    6
    7
    bool Push(StackPtr S, StackElementType x) {
    if (IsFull(S)) return false;

    S->elem[++S->top] = x;

    return true;
    }
  • 获取栈顶元素

    1
    2
    3
    4
    5
    6
    7
    bool GetTop(StackPtr S, StackElementType *x) {
    if (IsEmpty(S)) return false;

    *x = S->elem[S->top];

    return true;
    }
  • 出栈

    1
    2
    3
    4
    5
    6
    bool Pop(StackPtr S, StackElementType *x) {
    if (!GetTop(S, x)) return false;
    --S->top;

    return true;
    }

链栈

  • 初始化

    1
    2
    3
    4
    typedef struct node {
    StackElementType data;
    struct node *next;
    } LinkStackNode, *LinkStackNodePtr, LinkStack, Stack, *StackPtr;
  • 初始化

    1
    2
    3
    4
    void InitStack(StackPtr *S) {
    (*S) = (StackPtr)malloc(sizeof(LinkStackNode));
    (*S)->next = NULL; //栈顶指针置空
    }
  • 进栈

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool Push(StackPtr S, StackElementType x) {
    LinkStackNodePtr temp = (LinkStackNodePtr)malloc(sizeof(LinkStackNode));
    if (temp == NULL) return false;

    //链表的头插法
    temp->data = x;
    temp->next = S->next;
    S->next = temp;

    return true;
    }
  • 获取栈顶元素

    1
    2
    3
    4
    5
    6
    7
    bool GetTop(StackPtr S, StackElementType *x) {
    if (IsEmpty(S)) return false;

    *x = S->next->data;

    return true;
    }
  • 出栈

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool Pop(StackPtr S, StackElementType *x) {
    //在链表头部删除节点
    LinkStackNodePtr temp = S->next;
    if (temp==NULL) return false; //empty

    *x = temp->data;
    S->next = temp->next;
    free(temp);

    return true;
    }

队列

顺序队列(so easy,略)

链队列

  • 结构定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct Node {
    QueueElementType data; /*数据域*/
    struct Node *next; /*指针域*/
    } LinkQueueNode, *LinkQueueNodePtr;

    typedef struct {
    LinkQueueNode *front; /*队头指针*/
    LinkQueueNode *rear; /*队尾指针*/
    } LinkQueue, Queue, *QueuePtr;
  • 初始化

    1
    2
    3
    4
    5
    6
    void InitQueue(QueuePtr Q) {
    /* 将Q初始化为一个空的链队列 */
    Q->front = (LinkQueueNodePtr)malloc(sizeof(LinkQueueNode));
    Q->front->next = NULL; /*队头指针的指向为空*/
    Q->rear = Q->front; /*队尾指针指向队头*/
    }
  • 入队

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool EnterQueue(QueuePtr Q, QueueElementType x) {
    /* 将数据元素x插入到队列Q中 */
    LinkQueueNode *NewNode = (LinkQueueNodePtr)malloc(sizeof(LinkQueueNode));
    NewNode->data = x;
    NewNode->next = NULL;

    Q->rear->next = NewNode;
    Q->rear = NewNode;

    return true;
    }
  • 出队

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool DeleteQueue(QueuePtr Q, QueueElementType *x) {
    /* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */
    if (IsEmpty(Q)) return false;

    LinkQueueNodePtr p = Q->front->next;

    *x = p->data;
    Q->front->next = p->next;
    if (Q->rear == p) Q->rear = Q->front;
    free(p);

    return true;
    }

循环队列

  • 结构定义

    1
    2
    3
    4
    5
    6
    7
    8
    #define MAXSIZE 50  /*队列的最大长度*/

    typedef struct
    {
    QueueElementType element[MAXSIZE]; /* 队列的元素空间*/
    int front; /*头指针指示器*/
    int rear; /*尾指针指示器*/
    } SeqQueue, Queue, *QueuePtr;
  • 初始化

    1
    2
    3
    4
    void InitQueue(QueuePtr Q) {
    /* 将*Q初始化为一个空的循环队列 */
    Q->front = Q->rear = 0; /*头尾指针均置空*/
    }
  • 判断队列是否为空

    1
    2
    3
    bool IsEmpty(QueuePtr Q) {
    return Q->front == Q->rear;
    }
  • 判断队列是否已满

    1
    2
    3
    bool IsFull(QueuePtr Q) {
    return _modinc(Q->rear) == Q->front;
    }
  • 入队

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool EnterQueue(QueuePtr Q, QueueElementType x) {
    /*将元素x入队*/
    if (IsFull(Q)) /*队列已经满了*/
    return false;

    Q->element[Q->rear] = x;
    Q->rear = _modinc(Q->rear);

    return true;
    }
  • 出队

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool DeleteQueue(QueuePtr Q, QueueElementType *x) {
    /*删除队列的队头元素,用x返回其值*/
    if (IsEmpty(Q)) /*队列为空*/
    return false;

    *x = Q->element[Q->front];
    Q->front = _modinc(Q->front);

    return true;
    }
其他文章
cover
  • 24/06/22
  • 09:46
  • 数据结构
cover
线性表
  • 24/06/20
  • 09:46
  • 数据结构
目录导航 置顶
  1. 1.
    1. 1.1. 顺序栈
    2. 1.2. 链栈
  2. 2. 队列
    1. 2.1. 顺序队列(so easy,略)
    2. 2.2. 链队列
    3. 2.3. 循环队列
请输入关键词进行搜索