提示:这里简述项目相关背景:
队列练习题
原因分析:提示:这里填写问题的分析:
栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。 队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。
1.两个队列 为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中queue1用于存储栈内的元素,queue 2作为入栈操作的辅助队列,即存储临时入栈的元素
一个队列为主队列,一个为辅助队列,当入栈操作时,先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可
入栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入队到 queue2,此时queue2的前端的元素即为新入栈的元素,再将 queue1和 queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底
由于每次入栈操作都确保queue1的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得queue1的前端元素并返回即可(不移除元素)。
由于 queue1用于存储栈内的元素,判断栈是否为空时,只需要判断 queue1 是否为空即可。
2.一个队列
当某一元素入栈队时,将之前的出队,再重新入队即可 入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前 n个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。
由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。队列用于存储栈内的元素,判断栈是否为空时,只需要判断队列是否为空即可。
解决方案:提示:这里填写该问题的具体解决方案:
#define SIZE 20
typedef struct queue
{
int *data;
int front;
int rear;
int size;
} Queue;
typedef struct
{
Queue *queue1,*queue2;
}MyStack;
Queue *initQueue(int size)
{
Queue* obj=(Queue*)malloc(sizeof(Queue));//申请队列
obj->data=(int*)malloc(size*sizeof(int));//队列存储空间大小申请
obj->front=-1;
obj->rear=-1;
obj->size=size;
return obj;
}
void enQueue(Queue *obj,int e)
{
if(obj->front==-1)
{
obj->front=0;
}
obj->rear=(obj->rear + 1)%obj->size; //rear指针向后移
obj->data[obj->rear]=e;
}
int deQueue(Queue *obj)
{
int temp=obj->data[obj->front];
if(obj->front==obj->rear)
{
obj->rear=-1;
obj->front=-1;
return temp;
}
obj->front=(obj->front +1)%obj->size;
return temp;
}
int isEmpty(Queue *obj)
{
return obj->front==-1;
}
MyStack* myStackCreate()
{
MyStack *obj = (MyStack *)malloc(sizeof(MyStack));
obj->queue1 = initQueue(SIZE);
obj->queue2 = initQueue(SIZE);
return obj;
}
void myStackPush(MyStack* obj, int x)
{
if(isEmpty(obj->queue1)) // 空队列
{
enQueue(obj->queue2, x); //先加到2,
}
else
{
enQueue(obj->queue1, x); // 加到1
}
}
int myStackPop(MyStack* obj)
{
if(isEmpty(obj->queue1)) // 队列1空
{
while(obj->queue2->front != obj->queue2->rear) // 队列2不为空
{
enQueue(obj->queue1, deQueue(obj->queue2));
}
return deQueue(obj->queue2);
}
while(obj->queue1->front != obj->queue1->rear) // 队列1不为空
{
enQueue(obj->queue2, deQueue(obj->queue1));
}
return deQueue(obj->queue1);
}
int myStackTop(MyStack* obj)
{
if(isEmpty(obj->queue1))
{
return obj->queue2->data[obj->queue2->rear];
}
return obj->queue1->data[obj->queue1->rear];
}
bool myStackEmpty(MyStack* obj)
{
if(obj->queue1->front == -1 && obj->queue2->front == -1)
{
return true;
}
return false;
}
void myStackFree(MyStack* obj)
{
free(obj->queue1->data);
obj->queue1->data = NULL;
free(obj->queue1);
obj->queue1 = NULL;
free(obj->queue2->data);
obj->queue2->data = NULL;
free(obj->queue2);
obj->queue2 = NULL;
free(obj);
obj = NULL;
}
/**
* Your MyStack struct will be instantiated and called as such:
* MyStack* obj = myStackCreate();
* myStackPush(obj, x);
* int param_2 = myStackPop(obj);
* int param_3 = myStackTop(obj);
* bool param_4 = myStackEmpty(obj);
* myStackFree(obj);
*/
typedef struct tagListNode
{
struct tagListNode* next;
int val;
} ListNode;
typedef struct
{
ListNode* top;
} MyStack;
MyStack* myStackCreate()
{
MyStack* stk = calloc(1, sizeof(MyStack));
return stk;
}
void myStackPush(MyStack* obj, int x)
{
ListNode* node = malloc(sizeof(ListNode));
node->val = x;
node->next = obj->top;
obj->top = node;
}
int myStackPop(MyStack* obj)
{
ListNode* node = obj->top;
int val = node->val;
obj->top = node->next;
free(node);
return val;
}
int myStackTop(MyStack* obj)
{
return obj->top->val;
}
bool myStackEmpty(MyStack* obj)
{
return (obj->top == NULL);
}
void myStackFree(MyStack* obj)
{
while (obj->top != NULL)
{
ListNode* node = obj->top;
obj->top = obj->top->next;
free(node);
}
free(obj);
}