C语言查看队头元素,C语言实现循环队列的初始化进队出队读取队头元素判空-1...
目前,處在學習數據結構+ing,由于之前學過了隊列,今天就把自己寫過的代碼做了一些完善分享給大家,希望能夠幫助到有需要的朋友,有不足的地方歡迎大家交流? ??φ(゜▽゜*)?
隊列是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素,所以隊列具有先進先出的特性。
一、系統用到的抽象數據類型定義:
ADT Queue{
數據元素:可以是任意類型的數據,但必須屬于同一個數據對象。
數據關系:隊列中數據元素之間是線性關系。
基本操作:
initQueue(&Q);? ? ? ? ? ? ?//循環隊列初始化
enterQueue(&Q);? ? ? ? ? ? //循環隊列入隊操作
deleteQueue(&Q);????????? //循環隊列出隊操作
isEmpty(&Q);? ? ? ? ? ? ? ? ? //判斷隊列是否為空
getHead(&Q,&x);? ? ? ? ? ? //讀取隊列的隊頭元素 ,指針x指向隊頭元素
}ADT Queue;
二、系統中子程序及功能要求:
1.void initQueue(SeqQueue *Q);
操作前提:Q為未初始化的隊列。
操作結果:將Q初始化為一個空隊列。
2.int enterQueue(SeqQueue *Q,int n);
操作前提:隊列Q已存在。
操作結果:在隊列Q的隊尾插入n。操作成功,返回值為True,否則返回值為False。
3.void deleteQueue(SeqQueue *Q);
操作前提:隊列Q已存在。
操作結果:將隊列Q的隊頭元素出隊。操作成功,返回值為True,否則返回值為
False。
4.int isEmpty(SeqQueue *Q);
操作前提:隊列Q已存在。
操作結果:若隊列為空,則返回True,否則返回False。
5.int getHead(SeqQueue *Q,int *x);
操作前提:隊列Q已存在。
操作結果:取隊列Q的隊頭元素(該元素不出隊),并用x帶回其值。操作成功,
返回值為True,否則返回值為False。
三、代碼實現
/*順序表實現循環隊列的基本操作 (損失一個數組空間)*/
#include#include#define Queue_Size 50 //隊列的最大長度
#define True 1
#define False 0
typedef struct
{
int elem[Queue_Size]; //隊列的元素空間
int front; //頭指針指示器
int rear; //尾指針指示器
}SeqQueue;
void initQueue(SeqQueue *Q); //循環隊列初始化
int enterQueue(SeqQueue *Q,int n); //循環隊列入隊操作
void deleteQueue(SeqQueue *Q); //循環隊列出隊操作
int isEmpty(SeqQueue *Q); //判斷隊列是否為空
int getHead(SeqQueue *Q,int *x); //讀取隊列的隊頭元素 ,指針x指向隊頭元素
int main()
{
SeqQueue Q;
int choice,x;
while(true) //循環隊列操作選擇菜單
{
printf("*****************Please enter your choice*****************\n\n");
printf(" choice 1:Queue initialization\n");
printf(" choice 2:Into the queue\n");
printf(" choice 3:Out of the queue\n");
printf(" choice 4:Determine whether the queue is empty\n");
printf(" choice 5:Get queue head\n");
printf(" choice 0:exit\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
initQueue(&Q);
break;
case 2:
int n;
printf("Please enter the number into the queue elements:");
scanf("%d",&n); //讀入存入的隊列元素個數
//三目運算符根據返回值判斷元素是否進隊成功
(enterQueue(&Q,n)==1)?printf("%d個元素依次進隊成功\n",n):printf("%d個元素依次進隊失敗\n",n);
break;
case 3:
deleteQueue(&Q);
break;
case 4: //三目運算符根據返回值判斷隊列是否為空
(isEmpty(&Q)==1)?printf("An empty Queue\n"):printf("Not an empty Queue\n");
break;
case 5: //三目運算符根據返回值判斷隊頭元素是否讀取成功
(getHead(&Q,&x)==False)?printf("An empty Queue error!!!!\n"):printf("Get head successful,隊頭元素為:%d\n",x);
break;
case 0:
exit(0);
break;
default:
printf("ERROR!!\n");
exit(0);
break;
}
}
return 0;
}
void initQueue(SeqQueue *Q)
{ //將 *Q 初始化為一個空的循環隊列
Q->front=Q->rear=0;
}
int enterQueue(SeqQueue *Q,int n)
{ //將元素n入隊
int n1,n2;
printf("Please enter into the queue elements in turn:\n");
for(n1=0;n1rear+1)%Queue_Size==Q->front) return False; //尾指針加1追上頭指針,標志隊列已經滿了
scanf("%d",&n2);
Q->elem[Q->rear]=n2; //元素進隊
Q->rear=(Q->rear+1)%Queue_Size; //重新設置隊尾指針
}
return True; //操作成功
}
void deleteQueue(SeqQueue *Q)
{ //刪除隊列的隊頭元素
int a;
if(Q->front==Q->rear)
{ //隊列為空,刪除失敗
printf("An empty Queue error!!!!\n");
}
else
{
a=Q->elem[Q->front]; //刪除前先讀取隊頭元素
Q->front=(Q->front+1)%Queue_Size; //重新設置隊頭指針
printf("隊頂元素%d出隊成功.\n",a); //操作成功
}
}
int isEmpty(SeqQueue *Q)
{
if(Q->front==Q->rear)
{ //判斷隊列為空,返回True
return True;
}
return False; //否則返回False
}
int getHead(SeqQueue *Q,int *x)
{
if(Q->front==Q->rear)
{ //隊列為空,讀取失敗
return False;
}
else
{
*x=Q->elem[Q->front]; //操作成功
return True;
}
}
總結
以上是生活随笔為你收集整理的C语言查看队头元素,C语言实现循环队列的初始化进队出队读取队头元素判空-1...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new是不是c语言运算符优先级表,C语言
- 下一篇: android 分段显示百分比,按百分比