题目
思路:
- 声明两个队列,队列2用于备用(存放无用的元素),与用队列实现栈不同的是,队列是先进先出,栈顶指针为队列1尾指针
- step①:声明结构体存放栈和队列,初始化
typedef struct {
int queue1[100],queue2[100];//队列2是备用队列,主要功能由队列1实现
int front1,front2;
int tail1,tail2;//注意队列是先进先出
} MyStack;
MyStack* myStackCreate() {
MyStack *creat=malloc(sizeof(MyStack));
creat->front1=0;
creat->front2=0;
creat->tail1=0;
creat->tail2=0;
return creat;//记得返回此结构体
}
- step②:将元素x压入栈顶即放在队列1的尾部
//将元素存入队列,注意是尾指针后移
void myStackPush(MyStack* obj, int x) {
obj->queue1[(obj->tail1)++]=x;
}
- step③:返回栈顶元素并令其出队
难点:理解做法的含义,区分与用队列实现栈的不同之处
//栈顶元素出队
int myStackPop(MyStack* obj) {
int front1=obj->front1;
int front2=obj->front2;
int tail1=obj->tail1;
int tail2=obj->tail2;
//将队列1的元素除了最后一个外,备份到队列2
while(front1<tail1-1)
{
obj->queue2[tail2++]=obj->queue1[front1++];
}
//弹出队列1最后一个元素并保存
int top=obj->queue1[front1++];//注意此时front1是后移
//把其余队列2中的元素导回队列1
while(front2<tail2)
{
obj->queue1[tail1++]=obj->queue2[front2++];
}
//更新队列首尾指针
obj->front1=front1,obj->front2=front2;
obj->tail1=tail1,obj->tail2=tail2;
//返回栈顶指针(即队列1弹出的元素)
return top;
}
此时可以直观感受到更新队列首尾指针的重要作用:指针的位置一直在改变,更新后却不会影响队列操作
- step④:返回栈顶元素
//即返回栈尾元素
int myStackTop(MyStack* obj) {
return obj->queue1[(obj->tail1)-1];//与栈实现队列中栈顶指针intop和outtop的易错点相同
}
- step⑤:判空返回值
//判空,即队列1首尾指针相等
bool myStackEmpty(MyStack* obj) {
return obj->front1==obj->tail1;
}
- step⑥:置空
//释放栈,两个队列首尾指针都为0
void myStackFree(MyStack* obj) {
obj->front1=0,obj->front2=0;
obj->tail1=0,obj->tail2=0;
}
最终代码
typedef struct {
int queue1[100],queue2[100];//队列2是备用队列,主要功能由队列1实现
int front1,front2;
int tail1,tail2;//注意队列是先进先出
} MyStack;
MyStack* myStackCreate() {
MyStack *creat=malloc(sizeof(MyStack));
creat->front1=0;
creat->front2=0;
creat->tail1=0;
creat->tail2=0;
return creat;//记得返回此结构体
}
//将元素存入队列,注意是尾指针后移
void myStackPush(MyStack* obj, int x) {
obj->queue1[(obj->tail1)++]=x;
}
//栈顶元素出队
int myStackPop(MyStack* obj) {
int front1=obj->front1;
int front2=obj->front2;
int tail1=obj->tail1;
int tail2=obj->tail2;
//将队列1的元素除了最后一个外,备份到队列2
while(front1<tail1-1)
{
obj->queue2[tail2++]=obj->queue1[front1++];
}
//弹出队列1最后一个元素并保存
int top=obj->queue1[front1++];//注意此时front1是后移
//把其余队列2中的元素导回队列1
while(front2<tail2)
{
obj->queue1[tail1++]=obj->queue2[front2++];
}
//更新队列首尾指针
obj->front1=front1,obj->front2=front2;
obj->tail1=tail1,obj->tail2=tail2;
//返回栈顶指针(即队列1弹出的元素)
return top;
}
//即返回栈尾元素
int myStackTop(MyStack* obj) {
return obj->queue1[(obj->tail1)-1];//与栈实现队列中栈顶指针intop和outtop的易错点相同
}
//判空,即队列1首尾指针相等
bool myStackEmpty(MyStack* obj) {
return obj->front1==obj->tail1;
}
//释放栈,两个队列首尾指针都为0
void myStackFree(MyStack* obj) {
obj->front1=0,obj->front2=0;
obj->tail1=0,obj->tail2=0;
}
/**
* 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);
*/