题目描述
本题用到了栈和队列的知识,通过创建两个栈,一个栈入队,一个栈出队,从而能实现一个队列,如图
代码如下
#define MAX 10
typedef struct {
int data[MAX];
int Top; //栈顶元素
}Create_Stack;
typedef struct { //创建两个栈
Create_Stack S1;
Create_Stack S2;
} MyQueue;
/** Initialize your data structure here. */
MyQueue* myQueueCreate() { //栈初始化
MyQueue* myqueue=(MyQueue*)malloc(sizeof(MyQueue));
myqueue->S1.Top=-1;
myqueue->S2.Top=-1;
return myqueue;
}
/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
if(obj->S1.Top<MAX) //S1未满
{
while(obj->S1.Top!=-1)
{
obj->S2.data[++(obj->S2.Top)]=obj->S1.data[(obj->S1.Top)--];//S2入队,这里要确保S1中元素一次性全部压入S2中
}
obj->S1.data[++(obj->S1.Top)]=x;
while(obj->S2.Top!=-1)
{
obj->S1.data[++(obj->S1.Top)]=obj->S2.data[(obj->S2.Top)--]; //S2出队,S2中元素全部出队到S1中
}
}
}
/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) { //弹出队列首部元素
if(obj->S1.Top!=-1)
{
return obj->S1.data[(obj->S1.Top)--];
}
return NULL;
}
/** Get the front element. */
int myQueuePeek(MyQueue* obj) { //返回队列首部元素
if(obj->S1.Top!=-1)
{
return obj->S1.data[(obj->S1.Top)];
}
return NULL;
}
/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) { //判断队列是否为空
if(obj->S1.Top==-1)
{
return true;
}
return false;
}
void myQueueFree(MyQueue* obj) {
free(obj);
}
/**
* Your MyQueue struct will be instantiated and called as such:
* MyQueue* obj = myQueueCreate();
* myQueuePush(obj, x);
* int param_2 = myQueuePop(obj);
* int param_3 = myQueuePeek(obj);
* bool param_4 = myQueueEmpty(obj);
* myQueueFree(obj);
*/