2.编写单向循环队列(顺序存储结构)以下各种运算的算法,并实现程序测试: 1)向循环队列插入一个元素值为x的结点; 2)从循环队列中删除一个结点; 3)求循环队列的长度; 输出队列中所有元素。
时间: 2024-06-06 07:07:43 浏览: 99
算法如下:
1.向循环队列插入一个元素值为x的结点:
1)若队列满,则返回插入失败;
2)若队列未满,则将元素插入到队尾,并将队尾指针后移一位;
3)若队尾指针已经到达队列的末尾,则将其指向队列的头部。
2.从循环队列中删除一个结点:
1)若队列空,则返回删除失败;
2)若队列非空,则将队头指针后移一位,并将该元素删除;
3)若队头指针已经到达队列的末尾,则将其指向队列的头部。
3.求循环队列的长度:
1)若队头指针等于队尾指针,则队列为空;
2)若队头指针小于队尾指针,则队列长度为队尾指针减去队头指针;
3)若队头指针大于队尾指针,则队列长度为队列总长度减去队头指针再加上队尾指针。
4.输出队列中所有元素:
从队头指针开始遍历,按顺序输出队列中所有元素。
C++代码如下:
#include<iostream>
using namespace std;
const int MaxSize=50;
template<class T>
class SqQueue
{
public:
SqQueue(){front=rear=0;}
~SqQueue(){}
bool EnQueue(T x);//入队
bool DeQueue(T &x);//出队
bool GetFront(T &x);//取队头元素
bool Empty()const{return (front==rear)?true:false;}//队列是否为空
bool Full()const{return ((rear+1)%MaxSize==front)?true:false;}//队列是否已满
int Size()const{return (rear-front+MaxSize)%MaxSize;}//队列长度
void Clear(){front=rear=0;}//清空队列
void Traverse();//遍历队列
private:
int front,rear;//队头和队尾指针
T data[MaxSize];//队列数组
};
template<class T>
bool SqQueue<T>::EnQueue(T x)
{//入队操作
if(Full())
return false;
data[rear]=x;
rear=(rear+1)%MaxSize;
return true;
}
template<class T>
bool SqQueue<T>::DeQueue(T &x)
{//出队操作
if(Empty())
return false;
x=data[front];
front=(front+1)%MaxSize;
return true;
}
template<class T>
bool SqQueue<T>::GetFront(T &x)
{//取队头元素
if(Empty())
return false;
x=data[front];
return true;
}
template<class T>
void SqQueue<T>::Traverse()
{//遍历队列
int i=front;
while(i!=rear)
{
cout<<data[i]<<" ";
i=(i+1)%MaxSize;
}
cout<<endl;
}
int main()
{
SqQueue<int> q;
int choice,x;
while(1)
{
cout<<"1.入队"<<endl;
cout<<"2.出队"<<endl;
cout<<"3.获取队头元素"<<endl;
cout<<"4.求队列长度"<<endl;
cout<<"5.遍历队列"<<endl;
cout<<"6.退出"<<endl;
cout<<"请选择(1-6):";
cin>>choice;
switch(choice)
{
case 1:
cout<<"请输入待入队元素:";
cin>>x;
if(q.EnQueue(x))
cout<<"入队成功"<<endl;
else
cout<<"入队失败,队列已满"<<endl;
break;
case 2:
if(q.DeQueue(x))
cout<<"出队元素为:"<<x<<endl;
else
cout<<"出队失败,队列已空"<<endl;
break;
case 3:
if(q.GetFront(x))
cout<<"队头元素为:"<<x<<endl;
else
cout<<"获取队头元素失败,队列已空"<<endl;
break;
case 4:
cout<<"队列长度为:"<<q.Size()<<endl;
break;
case 5:
if(q.Empty())
cout<<"队列为空"<<endl;
else
q.Traverse();
break;
case 6:
exit(0);
default:
cout<<"输入错误,请重新输入"<<endl;
}
}
return 0;
}
阅读全文