栈实现队列(附带源码)

发布时间:2024年01月24日

一、思路图解

首先,队列:先进先出

栈:先进后出

那么,怎么用栈实现队列呢?

很简单,首先,创建两个栈

一个叫pushsatck,用来入队列

一个叫popstack,用来出队列

队列的核心在于先进先出,怎么实现?很简单

将pushstack的数据出栈,再入栈到popstack,看图:

你会发现,数据完美的倒过来了,如果现在要出队列,直接再popstack出栈即可

但是,现在还有几个问题:

1,如果还要队列怎么办?

例如:我要继续入队列6,7,8

很简单,直接入到pushstack里面,因为后面入队列的数据并不会影响前面数据的出队列

2、如果popstack出栈为空怎么办?

例如说popstack栈已经出空了,后面还有出队列,怎么办?

很简单,将pushsatck栈中的数据再倒到popstack即可

到此,比较核心的先入先出已经解决,其他问问题例如判空等,依据情况分析,很简单。画图略加思索即可。

下面直接手撕代码:

(额,注意,这是C语言实现,不是C++,没有STl库支持,咱只能自己敲出一个栈以及相关栈的函数实现。也很简单。学长以往的数据结构专栏博客有,需要的同学直接去复制粘贴好吧。)数组实现栈(附带源码)-CSDN博客

二、源码


// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType *a;
	int top;		// 栈顶
	int capacity;  // 容量 
}Stack;

// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);
// 初始化栈 
void StackInit(Stack* ps)
{
	STDataType* temp  = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (temp == NULL)
	{
		perror("malloc fail \n");
		exit(-1);
	}
	ps->a =  temp;
	ps->capacity = 4;
	ps->top = -1;
}
// 入栈 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->capacity == ps->top+1)
	{
		STDataType* temp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity *2);
		if (temp == NULL)
		{
			perror("realloc fail \n");
			exit(-1);
		}
		ps->a = temp;
		ps->capacity *= 2;
	}
		ps->a[ps->top + 1] = data;
		ps->top++;
}
// 出栈 
void StackPop(Stack* ps)
{
	assert(ps);
	if(ps->top == -1)
	{
		return ;
	}
	ps->top--;
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	if (ps->top == -1)
	{
		return -1;
	}
	return ps->a[ps->top];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
	assert(ps);
	if (ps->top == -1)
	{
		return -1;
	}
	return ps->top + 1;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	if (ps->top == -1)
		return 1;
	else
		return 0;
}
// 销毁栈 
void StackDestroy(Stack* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
	printf("destory success!\n");
}


typedef struct {
    Stack pushStack;
    Stack popStack;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue *sq = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&sq->pushStack);
    StackInit(&sq->popStack);
    return sq;
}

void myQueuePush(MyQueue* obj, int x) {
    StackPush(&obj->pushStack,x);
}

int myQueuePop(MyQueue* obj) {
    int front = myQueuePeek(obj);  
    StackPop(&obj->popStack);
    return front;
}

int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->popStack))
    {
        while(!StackEmpty(&obj->pushStack))
        {
            StackPush(&obj->popStack,StackTop(&obj->pushStack));
            StackPop(&obj->pushStack);
        }
    }

    return StackTop(&obj->popStack);    
}

bool myQueueEmpty(MyQueue* obj) {
    return  StackEmpty(&obj->pushStack) && StackEmpty(&obj->popStack); 
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->pushStack);
    StackDestroy(&obj->popStack);
    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);
*/

文章来源:https://blog.csdn.net/qq_51216031/article/details/135828607
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。