408王道数据结构课后代码习题(廿四)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

前言

计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里

代码是用 C++ 写的,全部可以编译运行,尽量包含暴力解和最优解(考试时间不够可以直接怼一个暴力上去,稳拿一半分以上)。

持续更新,目前更新进度:

  • 线性表 14/14
  • 链表 25/25
  • 栈 3/3
  • 队列 4/4
  • 栈和队列的应用
  • ...

仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。

3.2.6, 1

image.png

  • 队空:Q.front == Q.rear && Q.tag == 0
  • 队满:Q.front == Q.rear && Q.tag == 1
  • 因为只有进队操作会导致队满,所以在进队时将tag置为1,同理在出队时将tag置为0
bool enqueue(Queue &Q, int x) {
  if (Q.front == Q.rear && Q.tag == 1) {
    cout << "队列满" << endl;
    return false;
  }

  Q.data[Q.rear] = x;
  Q.rear = (Q.rear + 1) % maxsize;
  Q.tag = 1;
  return true;
}

bool dequeue(Queue &Q, int &x) {
  if (Q.front == Q.rear && Q.tag == 0) {
    cout << "队列空" << endl;
    return false;
  }

  x = Q.data[Q.front];
  Q.front = (Q.front + 1) % maxsize;
  Q.tag = 0;
  return true;
}
复制代码

2

image.png

  • 队内元素逐个出队入栈,全部入栈后再逐个出栈入队列即可
  • 非常简单的一道题,就是考察“先进先出”以及“后进先出”的性质
void reverseQueue(Queue &Q, Stack &S) {
  int x;
  while (!isEmpty(Q)) {
    dequeue(Q, x);
    push(S, x);
  }

  while (!isEmpty(S)) {
    pop(S, x);
    enqueue(Q, x);
  }
}
复制代码

3

image.png

  • S1的入栈用作入队,若S1满且S2空,才能将S1的元素插入S2中
  • S2的出栈用作出队,若S2空,将S1的所有元素插入S2中
  • 判空只需要判断两个栈是否都为空
bool Enqueue(Stack &S1, Stack &S2, int x) {
  if (!StackOverflow(S1)) {
    Push(S1, x);
    return true;
  }

  if (StackOverflow(S1) && !StackEmpty(S2)) {
    cout << "队列满" << endl;
    return false;
  }

  // S1满且S2空,先将S1中的元素全部入S2,再入S1
  while (!StackEmpty(S1)) {
    int tmp;
    Pop(S1, tmp);
    Push(S2, tmp);
  }
  Push(S1, x);
  return true;
}

bool Dequeue(Stack &S1, Stack &S2, int &x) {
  if (!StackEmpty(S2)) {
    Pop(S2, x);
    return true;
  } 
  
  if (StackEmpty(S1)) {
    cout << "队列空" << endl;
    return false;
  }
  
  // S2为空且S1不为空
  while (!StackEmpty(S1)) {
    int tmp;
    Pop(S1, tmp);
    Push(S2, tmp);
  }
  Pop(S2, x);
  return true;
}

bool QueueEmpty(Stack S1, Stack S2) {
  return StackEmpty(S1) && StackEmpty(S2);
}
复制代码

4

image.png

  • 如题,应选择链式存储结构,且为包含头尾指针的单循环链表(头front,尾rear)
  • 队空条件 front == rear
  • 队满条件 front == rear -> next
  • 遵循”入判满,出判空“的原则,写出伪代码即可

猜你喜欢

转载自juejin.im/post/7104657708556484616