1 设置一个标志域tag,并以tag的值为0或1,来区分对头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写此结构相应的入队和出对的算法
#define MaxSize50
typedef struct{
ElemType data[MaxSize];
int front,rear;//这里用的是数字来进行表明的
}SqQueue;
/循环队列需要用到数组来保存队列
//入队操作考虑队满的情况
int EnQueue( SqQueue &Q,Elemtype x){
if(front==rear&&tag==1){
return 0;
}
Q.data[rear]=x;//rear指针指向的是下一个元素的位置
Q.rear=(Q.rear+1)%Maxsize;//队尾指针向后移动
Q.tag=1;//在这里标明的是上一步进行的操作1
return 1;
}
//出对考虑队空的情况
int DnQueue( SqQueue &Q,Elemtype x){
if(front==rear&&tag==0){
return 0;//表明队空
}
x=Q.data[rear];
Q.rear=(Q.rear-1)%MaxSize;
Q.tag=0;
return 1;
}
2 Q是一个队列,S是一个空栈,并且将队列中的元素逆置
//该题主要利用了栈和队列的特性,只要将队列的元素全部入栈,然后出栈,需要注意的是,每出一个元素就进队
int Revese(Queue &Q ,Stack &S){
while(!QueueEmpty(Q)){
x=Dequeue(Q);
Push(S,x);
}
while(!Stack(S)){
Pop(S,x);//在这里Pop函数x是弹出的栈顶元素,在Pop函数中
Enqueue(Q,x);
}
//在这里补充Pop函数
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1){
return false;
}
x=S.data[S.top--];
return true;
}
}
3利用两个栈S1,S2来模仿一个队列,已知栈的4个运算定义
Push(S,x)
Pop(S,x)
StackEmpty(S)
*(S)
思想://该题的思想是通过两个栈来进行队列的实现,考虑到栈的队列的特性,即同时入栈和入队(同一序列数字假设),
//通过两次栈的反转就可以实现队列
入队操作:如果S1满必须保证S2为空,才能将S1中的元素全部插入S2中,然后在进行S1入栈操作
出对操作:对S2的出栈操作做出对操作,如果S2为空,先将S1中的所有元素送入S2,再对栈S2进行出栈操作
//该题的思想是通过两个栈来进行队列的实现,考虑到栈的队列的特性,即同时入栈和入队(同一序列数字假设),
//通过两次栈的反转就可以实现队列
入队操作:如果S1满必须保证S2为空,才能将S1中的元素全部插入S2中,然后在进行S1入栈操作
出对操作:对S2的出栈操作做出对操作,如果S2为空,先将S1中的所有元素送入S2,再对栈S2进行出栈操作i
入队算法
int Enqueue(Stack &s1,Stack &s2,ElemType e){
if(!*(s1)){
push(s1,e);
return 1;
}
if(*&&!StackEmpty(s2)){
printf("该队列为满");
return 0;
}
if(*&&StackEmpty(s2)){
while(StackEmpty(s1)){
pop(s1,x);
push(s1,x);
}
}
push(s1,e);
}
//出队算法
void DeQueue(Stack &s1,Stack &s2,ElemType &x){
if(!StackEmpty(s2)){
pop(s2,x);
}
else{
if(StackEmpty(s1)){
printf("队列为空");
}
else{
while(!StackEmpty(s1)){
pop(s1,x);
push(s2,x);
}
pop(s2,x);
}
}
}