数据结构入门3----队列
学完陷入后厨的Stack
先入先出,后入后出的队列了解一下?
这里也有顺序的数组算法和链式原理
NO.1顺序
这里需要想到环–》使得只有一个浪费的资源
typedef int ElementType;
typedef struct QNode * Queue;
struct QNode{
ElementType Data[MaxSize];
int rear;
int front;
};
基本操作
void AddQ(Queue PtrQ, ElementType item){
if((PtrQ->rear+1)%MaxSize == PtrQ->front){
printf("Stack is full\n");
return ;
}
PtrQ->rear = (PtrQ->rear+1)%MaxSize;
PtrQ->Data[PtrQ->rear] = item;
}
ElementType DeleteQ(Queue PtrQ){
if(PtrQ->front == PtrQ->rear){
printf("Stack is empty\n");
return -1;
}
else{
PtrQ->front = (PtrQ->front + 1)%MaxSize;
return PtrQ->Data[PtrQ->front];
}
}
NO.2 链式连接
typedef int ElementType;
typedef struct QNode * Queue;
struct Node{
ElementType d;
struct Node * Next;
};
struct QNode{
struct Node * rear;//队尾(插入)
struct Node * front;//队头(删除)
};
注意: 链表头必须做删除,因为链表尾没办法做删除,只能插入
是否为空:
bool IsEmpty(Queue PtrQ){
return (PtrQ->front == NULL);
}
入队,出队
//出队
ElementType DeleteQ(Queue PtrQ){
struct Node *FrontCell;
ElementType FrontNum;
if(PtrQ->front == NULL){ //空
printf("empty\n");
return -1;
}
else{
FrontCell = PtrQ->front;
FrontNum = FrontCell->d;
if(PtrQ->front == PtrQ->rear){ //只有一个元素
PtrQ->front = PtrQ->rear = NULL;
}
else{
PtrQ->front = FrontCell->Next;
}
free(FrontCell);
return FrontNum;
}
}
//入队
void InQueue(Queue PtrQ,ElementType item){
struct Node *Tmp;
Tmp->d = item;
struct Node *Last;
Last = PtrQ->rear;
if(PtrQ->front == NULL){ //空
PtrQ->front = Tmp;
PtrQ->rear = Tmp;
return ;
}
else{
Last->Next = Tmp;
PtrQ->rear = Tmp;
return ;
}
}
这里就已经学完最基本的线性结构知识啦~
要多做题才能掌握哦!