#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
// 初始化和销毁
void STInit(ST* pst);
void STDestroy(ST* pst);
// 入栈 出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
// 取栈顶数据
STDataType STTop(ST* pst);
// 判空
bool STEmpty(ST* pst);
// 获取数据个数
int STSize(ST* pst);
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
pst->top = 0;
pst->capacity = 0;
}
void STDestroy(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->capacity = pst->top = 0;
}
// 入栈 出栈
void STPush(ST* pst, STDataType x)
{
if (pst->top == pst->capacity)
{
assert(pst);
int newcapacity = pst->capacity == 0 ? 4 : 2 * (pst->capacity);
STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));;
if (tmp == NULL)
{
perror(malloc);
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
//置空
void STPop(ST* pst)
{
assert(pst);
assert(!STEmpty(pst));
pst->top--;
}
// 取栈顶数据
STDataType STTop(ST* pst)
{
assert(pst);
assert(!STEmpty(pst));
return pst->a[pst->top - 1];
}
// 判空
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top == 0;
}
// 获取数据个数
int STSize(ST* pst)
{
assert(pst);
return pst->top;
}
typedef struct {
ST pushest;
ST popest;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));
STInit(&(obj->pushest));
STInit(&(obj->popest));
return obj;
}
//
void myQueuePush(MyQueue* obj, int x) {
STPush(&(obj->pushest),x);
}
int myQueuePop(MyQueue* obj) {
int front=myQueuePeek(obj);
STTop(&(obj->popest));
return front;
}
int myQueuePeek(MyQueue* obj) {
if(STEmpty(&(obj->popest)))
{
while(!STEmpty(&(obj->pushest)))
{
int top=STTop(&(obj->pushest));
STPush(&(obj->popest),top);
STPop(&(obj->pushest));
}
}
return STTop(&(obj->popest));
}
bool myQueueEmpty(MyQueue* obj) {
return STEmpty(&(obj->popest)) && STEmpty(&(obj->pushest));
}
void myQueueFree(MyQueue* obj) {
STDestroy(&(obj->popest));
STDestroy(&(obj->pushest));
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);
*/
创建两个栈,一个栈用来放入元素,把这一个栈的元素从栈顶元素开始放入另一个栈中。从第二个栈中取出的栈顶元素就可以当作要实现的队的队头。
创建两个栈
模拟实现队列放数据直接放在其中pushest栈中
返回队列开头元素,把放入数据的pushest栈中的数据从栈顶元素开始放入popest栈中,然后返回popest栈的栈顶元素就是队头元素。
从队列的开头移除并返回元素,myQueuePop函数,直接用myQueuePeek这个函数来找到队头元素,pop掉并返回队头元素。