• 栈和队列


    0.PTA得分截图

    1.本周学习总结

    1.1 栈

    • 栈的图形
    • 定义:栈是一种线性结构,相比数组,栈的对应的操作是数组的子集,只能从一端添加元素,也只能从一端删除元素(这一端称为栈顶)。

    1.1.1 顺序栈

    1.顺序栈图形

    2.顺序栈相关知识

    • 栈空条件:top=-1
    • 栈满条件:top=maxsize-1

    1.1.2 链栈的结构、操作函数

    • 定义:采用链式存储结构的栈称为链栈,这里采用带头节点的单链表来实现链栈。

    栈的定义

    1 typedef struct sta
    2 {
    3     int stack[SIZE];    /* 存放栈中元素的一维数组 */
    4     int top;            /* 存放栈顶元素的下标 */
    5 }stack;
    

    栈的初始化

    
     1 /* Function:栈的初始化 */
     2 stack InitStack (stack p)
     3 {
     4     p.bottom = (int *)malloc(p.stack_size * sizeof(int));
     5     if (p.bottom == NULL)
     6     {
     7         printf("初始化栈失败
    ");
     8         exit(0);
     9     }
    10     p.top = p.bottom;
    11     p.stack_size = MAX_SIZE;
    12 
    13     return p;
    14 }
    

    入栈

    /* Function:入栈 */
    stack Push (stack p)
    {
        int data;
        if (StackFull(p) == Full)
        {
            printf("栈空间已满,无法入栈");
            return p;
        }
        printf("Please input data");
        scanf("%d", &data);
        *p.top = data;
        p.top++;
    
        return p;
    }
    

    出栈

    1 /* Function:出栈 */
     2 stack Pop (stack p)
     3 {
     4     if (StackEmpty(p) == Empty)
     5     {
     6         printf("栈为空栈,无法出栈 ");
     7         return p;
     8     }
     9     p.top--;
    10     printf("出栈元素为:%d
    ", *p.top);
    11 
    12     return p;
    13 }
    

    判断栈是否为空

    bool StackEmpty(SqStack s)
    {
    	return (s->top == -1);
    }
    

    链栈四个要素:

    • 栈空的条件:s->next == NULL.
    • 栈满的条件:链栈中可以看成不存在栈.
    • 元素e的进栈操作:新建节点存放e,将节点插入到头节点之后.
    • 出栈操作:取出首节点的data值并将其删除.

    1.2 栈的应用

    • 符号配对
    • 中缀表达式转后缀表达式

    1.3 队列

    1.画一个队列的图形

    2.

    • 初始化队列
      void InitQueue(SqQueue * &q)
          {
              q = (SqQueue *)malloc(sizeof(SqQueue));
              q->front = q->rear = -1;
          }
    
    • 销毁队列
    void DestoryQueue(Squeue * &q)
          {
              free(q);
          }
    
    • 判断队列是否为空
       bool QueueEmpty(SqQueue * Q)
          {
              return(q->front == q->rear);
          }
    
    • 进队
        Status EnQueue(SqQueue *Q,QElemtype e)
          {
    	  if(Q->rear==QUEUESIZE)
    	  {
    	      return ERROR;
    	  }
    	  Q->base[Q->rear]=e;
    	  Q->rear++;
    	  return OK;
          }
    
    • 出队
    Status DeQueue(SqQueue *Q,QElemtype *e)
          {
    	  if(Q->front==Q->rear)
    	  {
    	      return ERROR;
    	  }
    	  *e=Q->base[Q->front];
    	  Q->front++;
    	  return OK;
          }
    

    2.PTA实验作业

    2.1符号配对

    jmu-ds-符号配对

    2.1.1解题思路

    解题:输入一串字符串,遍历字符,将左括号依次放入栈中,在从栈顶开始和接下来的字符串比较,如果符号配对,就将栈顶的符号输出,继续比较下一个,最后观察栈是否为空。
    伪代码:

    定义栈q
    定义字符串t并输入
    for(i=0 to t[i]!='')
    {
    if(不是括号)
    continue
    if(左括号)
    入栈
    else if(右括号)
       {
          if(栈空)
              退出循环
          else
             {
                if(数组符号与栈顶配对)
                    出栈
             }
       }
    }
    if(栈为空且字符串完全遍历)
      输出yes
    else if(栈空)
      输出no
    else
    {
    输出栈顶元素和no
    }
    

    2.2银行业务队列简单模拟

    银行业务队列简单模拟

    2.2.1解题思路

    解题:先根据输入的数据,分为奇数和偶数两个队列,然后依次a处理两个奇数,b处理一个奇数,最后再看奇偶队列中 哪个剩余,剩余的直接输出在最后。
    伪代码:

    定义奇偶队列
    输入人数
    while(小于人数)
    {
    输入编号num
    if(num%2==0)
    进入偶队列
    else
    进入奇队列
    }
    if(两队列剩余人数都不为一)
    {
    while(两队列人数不空)
    两次输出奇队列队尾,出队
    一次输出偶队列队尾,出队
    }
    else if(奇或偶队列人数为一)
    直接输出,出队
    while(奇不为空或者偶不为空)
    将剩余队列中的元素输出并出队
    
  • 相关阅读:
    basis 文档
    profile default1
    profile default
    2101244
    Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
    1816647
    lvm管理:扩展lv、删除pv、lv等
    HPUX and AIX SSH 互信
    SLD Related Gateway Serivces Unavaliable
    [原创]K8 MSF Bind Shell TCP 连接工具
  • 原文地址:https://www.cnblogs.com/YYYchenzeyi/p/14619197.html
Copyright © 2020-2023  润新知