(四)假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试设计与此结构相应的插入和删除算法,编写代码,并带入数据运行验证通过。
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXQSIZE 5
typedef int QElemType;
typedef int Status;
typedef struct {
QElemType *base;
int front;
int rear;
int flag;
} SqQueue;
Status InitQueue(SqQueue &Q) {
Q.base=new QElemType[MAXQSIZE];
if(!Q.base)
exit (OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.front==Q.rear))
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
if(Q.rear == Q.front)
Q.flag = 1;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e){
if(Q.front==Q.rear)
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
if(Q.rear == Q.front)
Q.flag = 0;
return OK;
}
Status Judge(SqQueue Q){
if((Q.front==Q.rear)&&Q.flag==1)
cout<<"队列已满!"<<endl;
else if((Q.front==Q.rear)&&Q.flag==0)
cout<<"队列已空!"<<endl;
}
int main(){
SqQueue Q;
InitQueue(Q);
int e;
cout<<"请输入队列元素:"<<endl;
for(int i=0;i<5;i++){
cin>>e;
EnQueue(Q,e);
}
/*for(int i=0;i<5;i++){
DeQueue(Q,e);
}*/
Judge(Q);
return 0;
}
运行截图:
线性结构知识总结:
1,顺序表是指按逻辑次序依次存放在一组地址连续的存储单元的数据元素,可以使用插入算法输入顺序表的值。线性表的顺序存储是一种随机存取的存储结构,即读取或写入某个元素消耗的时间与元素的位置以及线性表的规模无关。
2,链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
为了表示每个数据元素ai 与其直接后继数据元素ai+1 之间的逻辑关系,节点除了要存储本身的信息,还要存储其直接后继的存储位置。
3,指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,这种存储结构为非顺序映像或链式影响。
4,首元结点是指链表中存储第一个数据元素的结点,头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,头指针是指向链表中第一个结点的指针。
5,链表的查找:要从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个结点为止。因此,链表不是随机存取结构
6,栈只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则,顺序栈是利用顺序存储结构实现栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
7,若在一个函数、过程或者数据结构定义的内部又直接(或间接)出现定义本身的应用,则称它们是递归的。
8,队列(Queue)只允许在一端进行插入,另一端进行删除操作,是一种先进先出(First In First Out)的线性表,简称FIFO。