栈和队列

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("初始化栈失败\n");
 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\n", *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]!='\0')
{
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(奇不为空或者偶不为空)
将剩余队列中的元素输出并出队
posted @ 2021-04-05 19:34  头秃了没  阅读(104)  评论(0编辑  收藏  举报