Problème d'algorithme Leetcode utilisant des files d'attente pour implémenter des piles

Exigences du sujet:

Insérez la description de l'image ici

Utilisez la file d'attente pour atteindre la pile

Le principe de quitter l'équipe: premier entré, premier sorti. Le principe de l'empilement: dernier entré, premier sorti.
Par exemple:
il y a quatre éléments 1, 2, 3 et 4 dans l'équipe à tour de rôle, l'ordre de leur départ est: 1, 2, 3, 4.
Si 1, 2, 3, 4 sont poussés dans la pile à tour de rôle, l'ordre pop est 4, 3, 2, 1.
C'est-à-dire que ce que l'opération pop supprime est le dernier élément 4 de la file d'attente actuelle. Ensuite, il suffit de retirer les 3 premiers éléments et de réintégrer la file d'attente. À ce stade, 4 est l'élément principal de l'équipe, puis retirez-le de la file d'attente. Regardez le diagramme ci-dessous:
Insérez la description de l'image ici

Les opérations restantes telles que l'obtention de l'élément supérieur de la pile, la destruction de la pile, etc. sont relativement simples, donc je n'entrerai pas dans les détails ici, et attacherai le lien pour réaliser la pile avec le lien queue - leetcode

Et le code complet:


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>


typedef int Qdatatype;
typedef struct Qnode {
    
    
	Qdatatype data;
	struct Qnode* next;
}Qnode;

typedef struct Queue {
    
    
	
	//头尾指针
	struct Qnode*head;
	struct Qnode*tail;

}Queue;


//初始化
void Init(Queue* q)
{
    
    
	if (q == NULL)
		return;
	q->head = q->tail = NULL;

}

//创建新结点
struct Qnode* creatnode(Qdatatype val)
{
    
    
	struct Qnode* node = (struct Qnode*)malloc(sizeof(struct Qnode));
	node->data = val;
	node->next = NULL;
	return node;
}

//入队-尾插
void Queuepush(Queue* q,Qdatatype val)
{
    
    
	if (q == NULL)
		return;
	// 尾插
	struct Qnode*node = creatnode(val);
	if (q->head == NULL)
		q->head = q->tail = node;
	else
	{
    
    
		q->tail->next = node;
		q->tail = node;
	}
}

//出队-头删
void Queuepop(Queue* q)
{
    
    
	if (q == NULL||q->head==NULL)
		return;
	//头删
	struct Qnode* next = q->head->next;
	free(q->head); 
	q->head = next;
	//若该队列只有一个结点,尾指针需要置空
	if (q->head == NULL)
		q->tail = NULL;
}

//获取队首元素
Qdatatype Queuefront(Queue* q)
{
    
    
	return q->head->data;
}

//队尾元素
Qdatatype Queueback(Queue* q)
{
    
    
	return q->tail->data;
}

//判断队列是否为空
int Queueempty(Queue* q)
{
    
    
	if (q->head == NULL)
		return 1;
	else
		return 0;
}

//队列大小
int Queuesize(Queue* q)
{
    
    
	int n = 0;
	struct Qnode*p=q->head;
	while (p)
	{
    
    
		++n;
		p = p->next;
	}
	return n;
}

//销毁队列
void Queuedestory(Queue*q)
{
    
    
	struct Qnode*cur=q->head;
	while (cur)
	{
    
    
		struct Qnode*next = cur->next;
		free(cur);
		cur = next;
	}
	q->head = q->tail = NULL;
}



typedef struct {
    
    
    struct Queue q;

} MyStack;

/** Initialize your data structure here. */

MyStack* myStackCreate() {
    
    
    MyStack* pst=(MyStack*)malloc(sizeof(MyStack));
    Init(&pst->q);
    return pst;
}

/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {
    
    
    Queuepush(&obj->q,x);
}

/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {
    
    
    int n=Queuesize(&obj->q);
    
    while(n>1)
    {
    
    
        //前n-1个元素出队再入队,此时队首为原来的队尾元素
        int front=Queuefront(&obj->q);
        Queuepop(&obj->q);
        Queuepush(&obj->q,front);
        --n;
    }
    int top=Queuefront(&obj->q);
    Queuepop(&obj->q);
    return top;

}

/** Get the top element. */
int myStackTop(MyStack* obj) {
    
    
    return Queueback(&obj->q);
}

/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {
    
    
    return Queueempty(&obj->q);
}

void myStackFree(MyStack* obj) {
    
    
    Queuedestory(&obj->q);
    free(obj);
}

/**
 * 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);
*/

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43962381/article/details/111992098
conseillé
Classement