三.队列的运用

1.链队:

插入 删除 打印 取队顶
#include <stdio.h>
#include <stdlib.h>

typedef struct Qnode{
    int data;
    struct Qnode *next;
}Qnode,*QuenePtr;

typedef struct {
    QuenePtr front;
    QuenePtr rear;
}LinkQueue;
//初始化
void InitQueue(LinkQueue *q){
    (*q).front=(QuenePtr)malloc(sizeof (Qnode));
    if(!(*q).front) exit(0);
    (*q).front->next=NULL;
    (*q).rear=(*q).front;
}
//销毁
void DestroyQueue(LinkQueue *q){
    while((*q).front){
        (*q).rear=(*q).front->next;
        free((*q).front);
        (*q).front=(*q).rear;
    }
}
//判空
int IsEmpty(LinkQueue q){
    if(q.rear==q.front) return 1;
    else return 0;
}
//入队
void EnQueue(LinkQueue *q,int e){
    QuenePtr p=(QuenePtr)malloc(sizeof(Qnode));
    if(!p)exit(0);
    p->data=e;
    p->next=NULL;
    (*q).rear->next=p;
    (*q).rear=p;
    
}
//出队
void DeQueue(LinkQueue *q,int *e){
    if((*q).rear==((*q).front)) printf("Empty !");
    QuenePtr p=(*q).front->next;
    *e=p->data;
    (*q).front->next=p->next;
    if((*q).rear ==p) (*q).rear=(*q).front;
    free(p);
}
//打印
void Show(LinkQueue *q){
    for(Qnode *p=q->front->next ;p!=NULL;p=p->next){
        printf("%d ",p->data);
    }
    printf("\n");
}

int main(){
    LinkQueue q;
    InitQueue(&q);
    
    for(int i=0;i<5;i++){
        int e; scanf("%d",&e);
        EnQueue(&q,e);
    }
    Show(&q);
    
    if(IsEmpty(q)) printf("empty!");
    else printf("not empty");
    
    int e;DeQueue(&q,&e); printf("出队元素是:%d \n",e);
    Show(&q);
     
    int val;scanf("%d",&val);
    
    
    DestroyQueue(&q);
    return 0;
}

2.循环队列

wenti

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100

typedef struct {
    int *base;
    int front ;
    int rear;
}SqQueue;

//初始化
void InitQueue (SqQueue *q){
    q->base=(int *)malloc (Maxsize *sizeof (int));
    if(!q->base) exit(0);
    q->front=0;
    q->rear=0;
}
//入队
void EnterQueue(SqQueue *q,int e){
    if((q->rear+1)%Maxsize==q->front) printf("Full!\n");
    q->base[q->rear]=e;
    q->rear=(q->rear +1)%Maxsize;
}
//取队头元素
void getElem(SqQueue q,int *e){
    if(q.front!=q.rear){
        *e=q.base[q.front];
    }
    else {
        printf("Empty! \n");
    }
}
//求队长
int Getlength(SqQueue q){
    int e;
    e=(q.rear-q.front+Maxsize)%Maxsize;
    return e;
}
//出队
void PopQueue(SqQueue *q,int *e){
    if(q->front==q->rear) printf("Empty! \n");
    *e=q->base[q->front];
    q->front=(q->front+1)%Maxsize;
}
//打印
void Print(SqQueue q){
    for (int i=q.front;i!=q.rear;){
        printf("%d ",q.base[i]);
        i=(i+1)%Maxsize;
    }
    printf("\n");
}

int main(){
    SqQueue q;
    int e;
    for(int i=0;i<5;i++){
        scanf("%d",&e);
        EnterQueue(&q,e);
    }
    Print(q);
    getElem(q,&e);
    printf("队顶元素是 %d \n",e);
    
    int length=Getlength(q);
    printf("队长是%d \n",length);
     
    PopQueue(&q,&e);
    printf("出队元素是%d \n",e);
    Print(q);
    return 0;
}

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Maxsize 50

typedef struct {
    int *base;
    int front;
    int rear;
}SqQueue;

void InitQueue(SqQueue *Q){
    (*Q).base=(int )malloc(Maxsize*sizeof(int));
    if(!(*Q).base)exit(0);
    (*Q).front=0;
    (*Q).rear=0;
}

void EnterQueue(SqQueue *q,int e){
    if(((*q).base+1) %Maxsize==q->front){
        printf("Full");
    }
    q->base[q->rear]=e;
    q->rear=(q->rear+1)%Maxsize;
}

void PopQueue(SqQueue *q,int *e){
    if(q->front==q->rear){
        printf("empty!\n");
    }
    e=q->base[q->front];
    q->front=(q->front+1)%Maxsize;
}

int Emp(SqQueue q){
    if(q.front==q.rear) return 0;
    else return 1;
}

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    int a[n];
    SqQueue Q;
    InitQueue(&Q);
    for(int i=0;i<n;i++){
        scanf("%d ",&a[i]);
        EnterQueue(&Q,a[i]);
    }
    int e;
    for(int i=0;i<m;i++){
        PopQueue(&Q,&e);
        printf("%d ",e);
    }
    
    if(Emp(Q)==1) printf("\n1");
    else printf("\n0");
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
 
#define TOTAL_SPACE 5
 
/**
 * Circle int queue.
 */
typedef struct CircleIntQueue
{
    int data[TOTAL_SPACE];
 
    int head;
 
    int tail;
}*CircleIntQueuePtr;
 
/**
 * Initialize the queue.
 */
CircleIntQueuePtr initQueue()
{
    CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
    resultPtr->head = 0;
    resultPtr->tail = 0;
 
    return resultPtr;
}// Of the first constructor
 
/**
 * Enqueue.
 *
 * @param paraValue The value of the new node.
 */
void enqueue(CircleIntQueuePtr paraPtr, int paraValue)
{
    if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
        printf("Queue full.\r\n");
        return;
    } // Of if
 
    paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
    paraPtr->tail++;
}// Of enqueue
 
/**
 * Dequeue.
 *
 * @return The value at the head.
 */
int dequeue(CircleIntQueuePtr paraPtr)
{
    int resultValue;
    if (paraPtr->head == paraPtr->tail) {
        printf("No element in the queue.\r\n");
        return -1;
    } // Of if
 
    resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
    paraPtr->head++;
 
    return resultValue;
}// Of dequeue
 
/**
 * Output the queue.
 */
void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
    int i;
    if (paraPtr->head == paraPtr->tail)
    {
        printf("Empty queue.");
        return;
    } // Of if
 
    printf("Elements in the queue: ");
    for (i = paraPtr->head; i < paraPtr->tail; i++)
    {
        printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
    } // Of for i
 
    printf("\r\n");
}//Of outputLinkQueue
 
/**
 * Unit test.
 */
void testLinkQueue()
{
    int i = 10;
    CircleIntQueuePtr tempPtr = initQueue();
    for (; i < 16; i ++)
    {
        enqueue(tempPtr, i);
    }//Of for i
 
    outputLinkQueue(tempPtr);
 
    for (i = 0; i < 6; i ++)
    {
        printf("dequeue gets %d\r\n", dequeue(tempPtr));
    }//Of for i
 
    enqueue(tempPtr, 8);
    outputLinkQueue(tempPtr);
}//Of testLinkQueue
 
/**
 * The entrance.
 */
int main()
{
    testLinkQueue();
    return 1;
    
}

3.问题 A: 【DS3-6】基于顺序存储的循环队列的基本操作

[命题人 : admin_ly]
时间限制 : 1.000 sec  内存限制 : 128 MB
 
题目描述

用顺序存储结构实现队列的入队、出队和判断队列是否为空操作。

输入

第一行输入两个整数n和m,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),m表示出队序列B的元素数量(m个数依次连续出队,中间没有入队的情况)。第二行为序列A(空格分隔的n个整数),整数之间用空格分隔。

输出

第一行输出m个整数,代表出队序列B的各个整数,整数之间用空格分隔。

第二行输出一个整数表示队列是否为空,队列为空输出0,不为空输出1。

样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">5 3
1 3 5 3 6
</span></span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">1 3 5
1</span></span></span></span></span>


#include<stdio.h>
#include<stdlib.h>

//数据类型
#define ElemType int
//队列的最大空间
#define MAXSIZE 8
//队列的管理结构
typedef struct Queue
{
    ElemType *base; //指向队列空间的基址
    int       front; //头指针
    int       rear; //尾指针
}Queue;
//队列初始化
void InitQueue(Queue *Q)
{
    //为队列分配存储空间
    Q->base = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
    if(Q->base == NULL) exit(0);
    //初始时队列为空,头指针和尾指针都指向0位置
    Q->front = 0;
    Q->rear = 0;
}

//入队操作
void EnQueue(Queue *Q, ElemType x)
{
    //判断循环队列是否已满
    if(((Q->rear+1)%MAXSIZE) == Q->front)
        printf("Full\n");
    //队列未满,将数据入队
    Q->base[Q->rear] = x;
    //更改尾指针的指向
    Q->rear = (Q->rear+1)%MAXSIZE;
}

//打印循环队列中的数据
void ShowQueue(Queue *Q)
{
    //遍历循环队列中的元素,并将数据打印
    for(int i=Q->front; i!=Q->rear;)
    {
        printf("%d ",Q->base[i]);
        //此操作是为了实现循环遍历
        i = (i+1)%MAXSIZE;
    }
    printf("\n");
}

//出队操作
int DeQueue(Queue *Q)
{
    //判断循环队列是否为空
    if(Q->front == Q->rear)
        printf("empty\n");
    //如果非空,实现可循环出队
    int e=Q->base[Q->front];
    Q->front = (Q->front+1)%MAXSIZE;
    return e;
}

int main()
{
    Queue Q;
    InitQueue(&Q);
    int m,n;
    scanf("%d %d",&n,&m);
    int a[n];
    for(int i=1; i<=n; ++i)
    {
        scanf("%d",&a[i]);
        EnQueue(&Q, a[i]);
    }
    for(int i=0;i<m;i++){
        int e=DeQueue(&Q);
        printf("%d ",e);
    }
    if(Q.front==Q.rear) printf("\n0");
    else printf("\n1");
    return 0;
}

 

2.问题 B: 【DS3-7】基于循环链表的队列的基本操作

[命题人 : admin_ly]
时间限制 : 1.000 sec  内存限制 : 128 MB
 
题目描述

用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。实现该队列的入队、出队和判断队列是否为空操作。

输入

第一行输入两个整数n和m,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),m表示出队序列B的元素数量(m个数依次连续出队,中间没有入队的情况)。第二行为序列A(空格分隔的n个整数),整数之间用空格分隔。 

输出

第一行输出m个整数,代表出队序列B的各个整数,整数之间用空格分隔。
第二行输出一个整数表示队列是否为空,队列为空输出0,不为空输出1

样例输入 Copy
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">5 3
1 3 5 3 6
</span></span></span></span></span></span></span>
样例输出 Copy
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">1 3 5
1
</span></span></span></span></span></span></span>
#include<stdio.h>
#include<stdlib.h>

/**
 * 链式循环队列结点结构体定义
 */
typedef struct QNode {
    
    int data;
    
    struct QNode *next;
    struct QNode *rear;
} QNode;
void init(QNode **queue) {
    *queue = (QNode *) malloc(sizeof(QNode));
    // 将链式队列头结点的 next 和 rear 指针都指向自身,因为是循环的,并且是空队列
    (*queue)->next = *queue;
    (*queue)->rear = *queue;
}


void enQueue(QNode **rear, int ele) {
    QNode *newNode = (QNode *) malloc(sizeof(QNode));
    newNode->data = ele;
    newNode->next = NULL;
    newNode->next = (*rear)->next;
    (*rear)->next = newNode;
    (*rear) = newNode;
}


int deQueue(QNode **rear) {
    if ((*rear)->next == *rear) {
        return 0;
    }

    QNode *headNode = (*rear)->next;
     QNode *startNode = headNode->next;
    int ele;
    ele = startNode->data;
     headNode->next = startNode->next;
   
    if (startNode==*rear){
        *rear=(*rear)->next;
    }
    free(startNode);
    return ele;
}


int Is_empty(QNode **rear){
    if ((*rear)->next == *rear) {
        return 0;
    }
    else return 1;
}

int main() {
    QNode *queue;
    init(&queue);
    int n,m;
    scanf("%d %d",&n,&m);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        enQueue(&(queue->rear), a[i]);
    }
   
    for(int i=0;i<m;i++){
        int p= deQueue(&(queue->rear));
        printf("%d ",p);
    }
    printf("\n");
    if(Is_empty(&(queue->rear))==1){
        printf("1");
    }
       else printf("0");
    return 0;

   
    
   

}

AHNU-DS

3。问题 C: 【DS3-08】使用队列判断整数是否为回文数

[命题人 : 2022069]

时间限制 : 1.000 sec  内存限制 : 128 MB
 

题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

输入

一个整数x

输出

如果 x 是一个回文整数,返回 true ;否则,返回 false 。

样例输入 Copy
121
样例输出 Copy
true
#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

void initQueue(Queue *q) {
    q->front = 0;
    q->rear = -1;
}

bool isQueueEmpty(Queue *q) {
    return q->rear < q->front;
}

bool isQueueFull(Queue *q) {
    return q->rear - q->front + 1 == MAX_SIZE;
}

void enqueue(Queue *q, int value) {
    if (isQueueFull(q)) {
        printf("Queue is full");
        return;
    }
    q->data[++q->rear] = value;
}

int dequeue(Queue *q) {
    if (isQueueEmpty(q)) {
        return -1;
    }
    return q->data[q->front++];
}
int dequeue1(Queue *q) {
    if (isQueueEmpty(q)) {
        return -1;
    }
    return q->data[q->rear--];
}
bool isPalindrome(int x) {
    if (x < 0) {  // 负数不是回文数
        return false;
    }
    Queue q;
    initQueue(&q);
    int temp = x;
    while (temp!= 0) {  // 将整数的每一位入队
    enqueue(&q,temp%10);temp=temp/10;
    }
    while (!isQueueEmpty(&q)) {  // 从队列头和队列尾分别取出数字比较
     if(dequeue(&q)!=dequeue1(&q)||dequeue(&q)&&dequeue1(&q)!=-1)
     return false;
    }    
    return true;
}

int main() {
    int num;
    scanf("%d", &num);
    if (isPalindrome(num)) {
        printf("true");
    } else {
        printf("false");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值