第三章算法设计题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三章算法设计题相关的知识,希望对你有一定的参考价值。

 

 

 

3.2.8

/***循环队列基本操作***/
#include<cstdlib>
#include<iostream>
#include<fstream>
using namespace std;

#define MAXQSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;

typedef struct {
  QElemType *base;//初始化时动态分配存储空间
  int front;//头指针
  int rear;//尾指针
} SqQueue;

//算法3.11 循环队列的初始化
Status InitQueue(SqQueue &Q)  //构造一个空队列Q
{
  Q.base = new QElemType[MAXQSIZE]; //为队列分配一个最大容量为MAXSIZE的数组空间
  if(!Q.base)
    exit(OVERFLOW); //存储分配失败
  Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空
  return OK;
}

bool QueueEmpty(SqQueue Q)
{
  return Q.front == Q.rear;
}

//算法3.12 求循环队列的长度
int QueueLength(SqQueue Q)  //返回Q的元素个数,即队列的长度
{
  return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

//算法3.13 循环队列的入队
Status EnQueue(SqQueue &Q, QElemType e)  //插入元素e为Q的新的队尾元素
{
  if((Q.rear + 1) % MAXQSIZE == Q.front)  //尾指针在循环意义上加1后等于头指针,表明队满
    return ERROR;
  Q.base[Q.rear] = e; //新元素插入队尾
  Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加1
  return OK;
}

//算法3.14 循环队列的出队
Status DeQueue(SqQueue &Q, QElemType &e)  //删除Q的队头元素,用e返回其值
{
  if(Q.front == Q.rear)
    return ERROR; //队空
  e = Q.base[Q.front]; //保存队头元素
  Q.front = (Q.front + 1) % MAXQSIZE; //队头指针加1
  return OK;
}


//销毁队列Q,Q不再存在
void DestroyQueue(SqQueue &Q)
{
  if(Q.base)
    delete []Q.base;
  Q.base = NULL;
  Q.front = Q.rear = 0;
}

Status dequeue_rear(SqQueue& Q, QElemType &e)
//Q是如上定义的循环队列,本算法实现从队尾删除,若删除成功,返回被删除元素,否则给出出错信息。
{
  if(Q.front == Q.rear)
    return ERROR; // 队空
  Q.rear = (Q.rear - 1 + MAXQSIZE) % MAXQSIZE;  //修改队尾指针。
  e = Q.base[Q.rear]; //返回出队元素
  return OK;
}//从队尾删除算法结束

Status enqueue_front(SqQueue& Q, QElemType x)
// Q是顺序存储的循环队列,本算法实现“从队头插入”元素x。
{
  if(Q.rear == (Q.front - 1 + MAXQSIZE) % MAXQSIZE)
    return ERROR; // 队满
  Q.front = (Q.front - 1 + MAXQSIZE) % MAXQSIZE; //修改队头指针。
  Q.base[Q.front] = x;      //x 入队列
  return OK;
}// 结束从队头插入算法。
int main()
{
  SqQueue Q;
  QElemType e;

  InitQueue(Q);
  enqueue_front(Q, 3);//队列3
  enqueue_front(Q, 4);//队列4 3
  enqueue_front(Q, 5);//队列5 4 3
  DeQueue(Q, e);//队列 4 3
  cout << e << endl; //5
  DeQueue(Q, e);//队列 3
  cout << e << endl; //4
  enqueue_front(Q, 2);//队列 2 3
  enqueue_front(Q, 1);//队列 1 2 3
  dequeue_rear(Q,e);//队列 1 2
  cout << e << endl; //3
  dequeue_rear(Q,e);//队列1
  cout << e << endl; //2



  return 0;
}

 

以上是关于第三章算法设计题的主要内容,如果未能解决你的问题,请参考以下文章

个人赛组2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)——热身赛

『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛正式赛) 部分题题解

2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛正式赛) 部分题题解

个人赛组2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)-正式赛

暑假第三天之每天一些题系列