leetcode 232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

思路:
一个栈pushST专门用来入数据,一个栈popST专门用来出数据;入队就向pushST栈入栈;出队就从popST中出栈,当popST中为空时,将pushST中所有数据依次出栈再入栈到popST中,然后popST出栈一个数据。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

//实现一个栈
typedef int SDataType;

//栈结构体
typedef struct Stack
{
	SDataType* ps;
	int top;
	int capacity;
}Stack;

//队列结构体
typedef struct {
    Stack pushST;
    Stack popST;
} MyQueue;

//栈初始化
void StackInit(Stack* p);

//检查容量
void CheckCapacity(Stack* p);

//入栈
void StackPush(Stack* p,SDataType x);

//出栈
void StackPop(Stack* p);

//获取栈顶元素
SDataType StackTop(Stack* p);

//获取栈中有效数据个数
int StackSize(Stack* p);

//判断栈是否为空
int StackEmpty(Stack* p);

//销毁栈
void StackDestory(Stack* p);

//栈初始化
void StackInit(Stack* p)
{
	assert(p);
	p->ps = NULL;
	p->top = 0;
	p->capacity = 0;
}

//入栈
void StackPush(Stack* p, SDataType x)
{
	assert(p);

	if (p->top == p->capacity)
	{
		//扩容
		int newcapacity = p->capacity == 0 ? 4 : p->capacity*2;

		SDataType* tmp = (SDataType*)realloc(p->ps,sizeof(SDataType)*newcapacity);
		if (tmp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		//扩容成功
		p->ps = tmp;
		p->capacity = newcapacity;
	}

	p->ps[p->top] = x;
	p->top++;
}

//出栈
void StackPop(Stack* p)
{
	assert(p);

	assert(p->top >0);

	p->top--;
}

//获取栈顶元素
SDataType StackTop(Stack* p)
{
	assert(p);
	assert(p->top >0);
	return p->ps[p->top - 1];
}

//获取栈中有效数据个数
int StackSize(Stack* p)
{
	assert(p);
	return p->top;
}

//判断栈是否为空
int StackEmpty(Stack* p)
{
	assert(p);

	return p->top > 0 ? 0 : 1;
}

//销毁栈
void StackDestory(Stack* p)
{
	assert(p);
	free(p->ps);
	p->ps = NULL;
	p->capacity = 0;
	p->top = 0;
}

//创建队列
MyQueue* myQueueCreate() {
    MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&q->pushST);
    StackInit(&q->popST);
    return q;
}

//入队
void myQueuePush(MyQueue* obj, int x) 
{
	assert(obj != NULL);
    StackPush((&obj->pushST),x);
}

//出队并返回
int myQueuePop(MyQueue* obj) 
{
	assert(obj != NULL);
	
	assert( !StackEmpty(&(obj->pushST)) || (!StackEmpty(&(obj->popST))) );
	//如果PopST为空
    if(StackEmpty(&obj->popST))
    {
    	//PushST出栈,PopST入栈
        while(!StackEmpty(&obj->pushST))
        {
            StackPush(&obj->popST,StackTop(&obj->pushST));
            StackPop(&obj->pushST);
        }    
    }
    int front = StackTop(&obj->popST);
    StackPop(&obj->popST);
    return front;
}

//返回队头数据
int myQueuePeek(MyQueue* obj) 
{
	assert(obj != NULL);
	
	assert( !StackEmpty(&(obj->pushST)) || (!StackEmpty(&(obj->popST))) );
	
    if(StackEmpty(&obj->popST))
    {
        while(!StackEmpty(&obj->pushST))
        {
            StackPush(&obj->popST,StackTop(&obj->pushST));
            StackPop(&obj->pushST);
        }
        
    }
    return StackTop(&obj->popST);
}

//队列是否为空
bool myQueueEmpty(MyQueue* obj)
 {
	assert(obj != NULL);
    return StackEmpty(&obj->popST) && StackEmpty(&obj->pushST);
}

//销毁队列
void myQueueFree(MyQueue* obj)
 {
	assert(obj != NULL);
    StackDestory(&obj->popST);
    StackDestory(&obj->pushST);
    free(obj);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值