【要求】
用两个队列queue1,queue2来实现栈的压栈和出栈功能。
【分析】
此问题类似于用两个栈实现队列的功能的思路,将队列queue1作为入栈专职,queue2作为中转,主要思路是,压栈时将所有元素全部进队queue1,出栈时由于要将queue1最后一个进来的元素输出,所以先将queue1除最后一个元素以外的所有元素转到queue2,出队输出最后一个元素后,将queue2所有元素出队,重新入队到queue1,从而实现栈的后进先出功能。
【举例】
abcde依次入队,就能实现入栈;若要出栈,则先出队,留下最后一个e输出,再把移动的元素还给原队,就是这么简单。
【测试代码】
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef int my_data;
typedef struct my_queue
{
my_data data[MAX];
int front;
int rear;
}my_queue;
//初始化一个空队列
int init_queue(my_queue *Q)
{
Q->front = 0;
Q->rear = 0;
return 0;
}
//入队
int enqueue(my_queue *Q, my_data e)
{
//判断队满?
if((Q->rear+1)%MAX == Q->front)
return 1;
Q->data[Q->rear] = e;
Q->rear = (Q->rear +1)%MAX;//移一位
return 0;
}
//出队
int dequeue(my_queue *Q, my_data *e)
{
//先判断是否为空队
if(Q->rear == Q->front)
return 1;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAX;//移一位
return 0;
}
//队列长度
int queue_length(my_queue *Q)
{
return (Q->rear-Q->front+MAX)%MAX;
}
void push(my_queue *Q1,my_queue *Q2,my_data *e)
{
enqueue(Q1,*e);
}
void pop(my_queue *Q1,my_queue *Q2,my_data *e)
{
if(Q2->front == Q2->rear)
{
while(Q1->front +1!= Q1->rear)
{
dequeue(Q1,e);
enqueue(Q2,*e);
}
dequeue(Q1,e);
printf("谁出去了%d\n",*e);
}
while(Q2->front != Q2->rear)
{
dequeue(Q2,e);
enqueue(Q1,*e);
}
}
void test(my_queue *Q1,my_queue *Q2,my_data *e)
{
int s[MAX];
printf("请输入入队成员\n");
for(int i= 0; i<MAX-1;i++)
{
scanf("%d",&s[i]);
push(Q1,Q2,&s[i]);
}
int length =queue_length(Q1);
printf("q1队列长度%d\n",length);
printf("***************\n");
pop(Q1,Q2,e);
printf("q1队列长度%d\n",queue_length(Q1));
printf("***************\n");
pop(Q1,Q2,e);
printf("q1队列长度%d\n",queue_length(Q1));
}
int main()
{
my_queue *queue1 = (my_queue *)malloc(sizeof(my_queue));
my_queue *queue2 = (my_queue *)malloc(sizeof(my_queue));
init_queue(queue1);
init_queue(queue2);
my_data *e = (my_data *)malloc(sizeof(my_data));
test(queue1,queue2,e);
}
【输出】
时间: 2024-11-06 14:13:27