使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法
題目描述:
大家都知道數(shù)據(jù)結(jié)構(gòu)里面有一個(gè)結(jié)構(gòu)叫做循環(huán)隊(duì)列。顧名思義,這是一個(gè)隊(duì)列,并且是循環(huán)的。但是現(xiàn)在,淘氣的囧哥給這個(gè)循環(huán)隊(duì)列加上了一些規(guī)矩,其中有5條指令:
(1) Push K, 讓元素K進(jìn)隊(duì)列。
(2) Pop,對(duì)頭元素出隊(duì)列。
(3) Query K,查找隊(duì)列中第K個(gè)元素,注意K的合法性。
(4) Isempty,判斷隊(duì)列是否為空。
(5) Isfull,判斷隊(duì)列是否已滿。
現(xiàn)在有N行指令,并且告訴你隊(duì)列大小是M。
輸入:
第一行包含兩個(gè)整數(shù)N和M。1<=N,M<=100000。
接下來(lái)有N行,表示指令,指令格式見(jiàn)題目描述。
其中元素均在int范圍。
輸出:
對(duì)于指令(1),若隊(duì)列已滿,輸出failed,否則不做輸出。
對(duì)于指令(2),若隊(duì)列已空,輸出failed,否則不做輸出。
對(duì)于指令(3),輸出隊(duì)列中第K個(gè)元素,若不存在,輸出failed。
對(duì)于指令(4)和(5),則用yes或者no回答。
詳情見(jiàn)樣例。
樣例輸入:
12 2Push 1Push 2Push 3Query 2Query 3IsemptyIsfullPopPopPopIsemptyIsfull
樣例輸出:
failed2failednoyesfailedyesno
AC代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define queuesize 100001 //最大隊(duì)列長(zhǎng)度
struct queue
{
int front;
int rear;
int data[queuesize];
int count; //記錄隊(duì)列中的元素
};
void InitQueue(struct queue *Q);
void EnQueue(struct queue *Q, int element, int m);
void Dequeue(struct queue *Q, int m);
void QueueSearch(struct queue *Q, int k, int m);
int main()
{
int n, m, i, element, k, flag;
char command[10];
while(scanf("%d%d",&n, &m) != EOF)
{
if(n < 1 || m > 100000)
return 0;
struct queue *Q;
Q = malloc(sizeof(struct queue));
InitQueue(Q);
for(i = 0; i < n; i ++)
{
scanf("%s",command);
if (strcmp(command,"Push") == 0)
{
scanf("%d",&element);
EnQueue(Q, element, m);
}else if (strcmp(command,"Pop") == 0)
{
Dequeue(Q, m);
}else if (strcmp(command,"Query") == 0)
{
scanf("%d",&k);
QueueSearch(Q, k, m);
}else if (strcmp(command,"Isempty") == 0)
{
flag = (Q -> count == 0)? 1 : 0;
if(flag)
{
printf("yes\n");
}else
{
printf("no\n");
}
}else if (strcmp(command,"Isfull") == 0)
{
flag = (Q -> count == m)? 1 : 0;
if(flag)
{
printf("yes\n");
}else
{
printf("no\n");
}
}
}
}
return 0;
}
/**
* Description:隊(duì)列初始化
*/
void InitQueue(struct queue *Q)
{
Q -> front = Q -> rear = 0;
Q -> count = 0;
}
/**
* Description:入隊(duì)操作
*/
void EnQueue(struct queue *Q, int element, int m)
{
int flag;
flag = (Q -> count == m)? 1 : 0;
if(!flag)
{
Q -> data[Q -> rear] = element;
Q -> count ++;
Q -> rear = (Q -> rear + 1) % m;
}else
{
printf("failed\n");
}
}
/**
* Description:出隊(duì)操作
*/
void Dequeue(struct queue *Q, int m)
{
int flag;
int element;
flag = (Q -> count == 0)? 1 : 0;
if(!flag)
{
element = Q -> data[Q -> front];
Q -> front = (Q -> front + 1) % m;
Q -> count --;
}else
{
printf("failed\n");
}
}
/**
* Description:查找隊(duì)列中的指定元素
*/
void QueueSearch(struct queue *Q, int k, int m)
{
int flag, temp;
flag = (Q -> count == 0)? 1: 0;
temp = Q -> front + k - 1;
if((!flag) && (k <= m && k >= 1))
{
if((Q -> front < Q -> rear) && ( Q-> front <= temp && Q -> rear > temp))
printf("%d\n",Q -> data[temp]);
else if((Q -> front > Q -> rear) && (temp >= Q -> front || temp < Q->rear))
printf("%d\n",Q -> data[temp]);
else if(Q -> front == Q -> rear)
printf("%d\n",Q -> data[temp]);
else
printf("failed\n");
}else
{
printf("failed\n");
}
}
- C語(yǔ)言循環(huán)隊(duì)列與用隊(duì)列實(shí)現(xiàn)棧問(wèn)題解析
- C語(yǔ)言實(shí)現(xiàn)順序循環(huán)隊(duì)列實(shí)例
- C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作
- C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列
- 詳解數(shù)據(jù)結(jié)構(gòu)C語(yǔ)言實(shí)現(xiàn)之循環(huán)隊(duì)列
- C語(yǔ)言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
- C語(yǔ)言詳解鏈?zhǔn)疥?duì)列與循環(huán)隊(duì)列的實(shí)現(xiàn)
相關(guān)文章
適合初學(xué)者的C語(yǔ)言數(shù)據(jù)類型的講解
在 C 語(yǔ)言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式。2022-04-04
C++中字符串與整型及浮點(diǎn)型轉(zhuǎn)換全攻略
C++算法刷題等過(guò)程中經(jīng)常會(huì)遇到字符串與數(shù)字類型的轉(zhuǎn)換,在這其中雖然樸素的算法有不少,但是對(duì)于double等類型還是可以說(shuō)遇到一些麻煩,所以今天就來(lái)說(shuō)說(shuō)使用C++標(biāo)準(zhǔn)庫(kù)中的函數(shù)實(shí)現(xiàn)這些功能。感興趣的小伙伴一起參與閱讀吧2021-09-09
從txt中讀入數(shù)據(jù)到數(shù)組中(fscanf)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇從txt中讀入數(shù)據(jù)到數(shù)組中(fscanf)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問(wèn)題的解法
這篇文章主要介紹了如何解決字符串反轉(zhuǎn)問(wèn)題,通過(guò)將字符串按每2k個(gè)字符為一個(gè)區(qū)間進(jìn)行劃分,并使用雙指針?lè)椒▉?lái)確定實(shí)際反轉(zhuǎn)的邊界,最終實(shí)現(xiàn)字符串按特定規(guī)則進(jìn)行反轉(zhuǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法
本文主要介紹了C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

