- 用栈实现队列-C实现
题目链接:https://leetcode-cn.com/problems/implement-queue-using-stacks/
解题思路:https://leetcode-cn.com/problems/implement-queue-using-stacks/solution/yong-zhan-shi-xian-dui-lie-by-leetcode/
队列是先入先出,所以为了让后压入的元素放在栈底,在push时,我们首先需要把 s1 中所有的元素移到 s2 中,接着把新元素压入 s1,最后把 s2中所有的元素重新压回 s1。
//定义栈
typedef struct{
//栈
int* stack;
//栈的大小
int stackSize;
//栈的容量
int stackCapacity;
}MyStack;
//栈的初始化
MyStack* myStackCreate(int capacity){
MyStack* mystack = (MyStack*)malloc(sizeof(MyStack));
mystack->stack = (int*)malloc(sizeof(int) * capacity);
mystack->stackSize = 0;
mystack->stackCapacity = capacity;
return mystack;
}
//入栈
void myStackPush(MyStack* mystack, int val){
mystack->stack[mystack->stackSize++] = val;
}
//出栈
void myStackPop(MyStack* mystack){
mystack->stackSize--;
}
//获取栈顶元素
int myStackPeek(MyStack* mystack){
return mystack->stack[mystack->stackSize-1];
}
//栈是否为空
bool myStackEmpty(MyStack* mystack){
return mystack->stackSize == 0;
}
//释放栈空间
void myStackFree(MyStack* mystack){
free(mystack->stack);
}
//用两个栈实现队列
typedef struct {
MyStack* instack;
MyStack* outstack;
} MyQueue;
//两个栈的初始化
MyQueue* myQueueCreate() {
MyQueue* ret = malloc(sizeof(MyQueue));
ret->instack = myStackCreate(100);
ret->outstack = myStackCreate(100);
return ret;
}
//入队
void myQueuePush(MyQueue* obj, int x) {
//先把输入栈的val压入输出栈中
while(!myStackEmpty(obj->instack)){
myStackPush(obj->outstack, myStackPeek(obj->instack));
myStackPop(obj->instack);
}
//将x压入输入栈
myStackPush(obj->instack, x);
//把输出栈的val压回输入栈
while(!myStackEmpty(obj->outstack)){
myStackPush(obj->instack, myStackPeek(obj->outstack));
myStackPop(obj->outstack);
}
}
//出队
int myQueuePop(MyQueue* obj) {
int n = obj->instack->stack[obj->instack->stackSize-1];
obj->instack->stackSize--;
return n;
}
//获取队首元素
int myQueuePeek(MyQueue* obj) {
return obj->instack->stack[obj->instack->stackSize-1];
}
bool myQueueEmpty(MyQueue* obj) {
return myStackEmpty(obj->instack);
}
void myQueueFree(MyQueue* obj) {
free(obj->instack);
free(obj->outstack);
}
/**
* 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);
*/