一、题目描述
二、思路
利用两个栈去实现队列的功能,一个输入栈,一个输出栈。
创建队列后,当需要将元素放进队列时,直接将值赋给输入栈顶部元素,并将栈顶指针加一;
当需要返回队列头部元素时,判断输出栈是否有有效元素,即判断输出栈栈顶指针是否为零:若为零,则返回 输入栈 栈底元素;若不为零,则直接返回 输出栈 栈顶元素;
当需要移除队列头部元素时,判断输出栈是否有有效元素,即判断输出栈栈顶指针是否为零:若为零,则将输入栈中所有元素移入到输出栈中,再移除 输出栈 栈顶元素;若不为零,则直接移除 输出栈 栈顶元素;
当需要对队列判空时,判断输出栈栈顶指针与输入栈栈顶指针是否均为零,若是,返回 true;反之返回 false。
三、解题思路
-
定义队列
typedef struct {
int stackInTop, stackOutTop;
int stackIn[100], stackOut[100];
} MyQueue;
-
创造队列
MyQueue* myQueueCreate() {
MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
queue -> stackInTop = 0;
queue -> stackOutTop = 0;
return queue;
}
-
将元素 x 推到队列的末尾
void myQueuePush(MyQueue* obj, int x) {
obj -> stackIn[(obj -> stackInTop)++] = x;
}
-
从队列的开头移除并返回元素
int myQueuePop(MyQueue* obj) {//移除队列头部元素
int stackInTop = obj -> stackInTop;
int stackOutTop = obj -> stackOutTop;
if(stackOutTop == 0){
while(stackInTop){
obj -> stackOut[stackOutTop++] = obj -> stackIn[--stackInTop];
}
}
int top = obj -> stackOut[--stackOutTop];
obj -> stackInTop = stackInTop;
obj -> stackOutTop = stackOutTop;
return top;
}
-
返回队列开头的元素
int myQueuePeek(MyQueue* obj) {//返回队列头部元素
if(obj -> stackOutTop == 0) return obj -> stackIn[0];
return obj -> stackOut[obj -> stackOutTop - 1];
}
-
判断队列是否为空
- 如果队列为空,返回
true
;否则,返回false
bool myQueueEmpty(MyQueue* obj) {//判空
// if(obj -> stackInTop == 0 && obj -> stackOutTop == 0) return true;
// return false;
return obj -> stackInTop == 0 && obj -> stackOutTop == 0;
}
-
清空栈
void myQueueFree(MyQueue* obj) {//清空栈
obj -> stackInTop = 0;
obj -> stackOutTop = 0;
}
四、代码
typedef struct {
int stackInTop, stackOutTop;
int stackIn[100], stackOut[100];
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
queue -> stackInTop = 0;
queue -> stackOutTop = 0;
return queue;
}
void myQueuePush(MyQueue* obj, int x) {
obj -> stackIn[(obj -> stackInTop)++] = x;
}
int myQueuePop(MyQueue* obj) {//移除队列头部元素
int stackInTop = obj -> stackInTop;
int stackOutTop = obj -> stackOutTop;
if(stackOutTop == 0){
while(stackInTop){
obj -> stackOut[stackOutTop++] = obj -> stackIn[--stackInTop];
}
}
int top = obj -> stackOut[--stackOutTop];
obj -> stackInTop = stackInTop;
obj -> stackOutTop = stackOutTop;
return top;
}
int myQueuePeek(MyQueue* obj) {//返回队列头部元素
if(obj -> stackOutTop == 0) return obj -> stackIn[0];
return obj -> stackOut[obj -> stackOutTop - 1];
}
bool myQueueEmpty(MyQueue* obj) {//判空
// if(obj -> stackInTop == 0 && obj -> stackOutTop == 0) return true;
// return false;
return obj -> stackInTop == 0 && obj -> stackOutTop == 0;
}
void myQueueFree(MyQueue* obj) {//清空栈
obj -> stackInTop = 0;
obj -> stackOutTop = 0;
}