隊的定義、入隊和出隊
阿新 • • 發佈:2019-02-05
隊是限定在表的一端進行插入另一端進行刪除的線性表。
特點:先進先出(FIFO),後進後出(LILO)。
包含順序隊和鏈隊:
順序隊:front=rear=0表示隊空,入隊rear+1,出隊:front+1;順序隊的容量定義為M。
但是當front=rear=M時,會導致假溢位,因為此時隊裡沒有元素,卻被認為隊滿了。
解決方案有兩個:1,另設一個標誌位,區別隊滿隊空,return m;(m代表隊中元素的個數);
2,少用一個元素空間。
對於2中的情況:入隊時:rear=(rear+1)%M; Q[rear]=x;
出隊時:front=(front+1)%M; x=Q[front];
順序隊的定義:
typedef int datatype;
typedef struct sequence
{
datatype q[M];
int front,rear;
}sequence;
入隊:
void addq(sequence *s,datatype x)
{
if((s->rear+1)%M==s->front)
cout<<"隊滿"<<endl;
else
{
s->rear=(s->rear+1)%M;
s->q[s->rear]=x;
}
}
出隊:
隊的初始化:datatype delcq(sequence *s) { if(s->rear==s->front) { cout<<"隊空"<<endl; return 0; } else { s->front=(s->front+1)%M; return s->q[s->front]; } }
void initsq(sequence *s)
{
s->rear=0,s->front=0;
datatype dat=0;
printf("輸入一個整數,以0結束\n");
scanf("%d",&dat);
while(dat!=0)
{
addq(s,dat);
scanf("%d",&dat);
}
}
一個完整的程式碼:
#include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; #define M 10 typedef int datatype; typedef struct sequence { datatype q[M]; int front,rear; }sequence; void addq(sequence *s,datatype x) { if((s->rear+1)%M==s->front) cout<<"隊滿"<<endl; else { s->rear=(s->rear+1)%M; s->q[s->rear]=x; } } datatype delcq(sequence *s) { if(s->rear==s->front) { cout<<"隊空"<<endl; return 0; } else { s->front=(s->front+1)%M; return s->q[s->front]; } } void initsq(sequence *s) { s->rear=0,s->front=0; datatype dat=0; printf("輸入一個整數,以0結束\n"); scanf("%d",&dat); while(dat!=0) { addq(s,dat); scanf("%d",&dat); } } int main() { sequence *ss; ss=new sequence; initsq(ss); for(int i=0;i<M-1;i++) { cout<<delcq(ss)<<endl; } cout<<delcq(ss)<<endl; }
鏈隊:用連結串列的形式表示的佇列
定義:
typedef int datatype;
typedef struct sequence
{
datatype data;
struct sequence *next;
}node;
typedef struct linksequen
{
node *front,*rear;
}sequen;
入隊:
void addlinks(sequen *s,datatype x)
{
node *p=new node;
p->data=x;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
出隊:
datatype delink(sequen *s)
{
node *qs;
datatype value;
if(s->front==s->rear)
{
cout<<"隊空"<<endl;
return 0;
}
else
{
qs=s->front->next;
value=qs->data;
s->front->next=qs->next;
delete qs;
return value;
}
}
初始化:
void initsq(sequen *s)
{
s->front=s->rear=new node;
if(!(s->front))
cout<<"error"<<endl;
else
s->front->next=NULL;
datatype dat=0;
printf("輸入幾個整數,以0結束\n");
scanf("%d",&dat);
while(dat!=0)
{
addlinks(s,dat);
scanf("%d",&dat);
}
}
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int datatype;
typedef struct sequence
{
datatype data;
struct sequence *next;
}node;
typedef struct linksequen
{
node *front,*rear;
}sequen;
void addlinks(sequen *s,datatype x)
{
node *p=new node;
p->data=x;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
datatype delink(sequen *s)
{
node *qs;
datatype value;
if(s->front==s->rear)
{
cout<<"隊空"<<endl;
return 0;
}
else
{
qs=s->front->next;
value=qs->data;
s->front->next=qs->next;
delete qs;
return value;
}
}
void initsq(sequen *s)
{
s->front=s->rear=new node;
if(!(s->front))
cout<<"error"<<endl;
else
s->front->next=NULL;
datatype dat=0;
printf("輸入幾個整數,以0結束\n");
scanf("%d",&dat);
while(dat!=0)
{
addlinks(s,dat);
scanf("%d",&dat);
}
}
int main()
{
sequen *sque;
sque=new sequen;
initsq(sque);
cout<<delink(sque)<<endl;
}