Implementación simple de la pila

contenido

El concepto y la estructura de la pila.

icono

analizar

Implementación de pila

definición

inicialización

destruir

empujar la pila

estallido

Comprobar si la pila está vacía

 número de datos

acceder al elemento superior de la pila

archivo principal

archivo de prueba 


El concepto y la estructura de la pila.

Un tipo especial de tabla lineal que permite la inserción y eliminación de elementos solo en un extremo fijo. Un extremo donde se realizan la inserción y eliminación de datos se denomina parte superior de la pila y el otro extremo se denomina parte inferior de la pila. Los elementos de datos en la pila siguen el principio de último en entrar, primero en salir.

( Mesa lineal con un extremo cerrado )


Empujar pila: La operación de inserción de la pila se llama empujar/empujar/empujar, y los datos empujados están en la parte superior de la pila.
Pop: La eliminación de la pila se llama pop. Los datos salientes también están en la parte superior de la pila

 

icono

analizar

La pila es una lista lineal, que se implementa mejor con matrices dinámicas.

Debe desarrollarse dinámicamente y es necesario registrar el número de elementos válidos, la capacidad del espacio y la posición de la parte superior de la pila.

Puede consultar la tabla de secuencias para comprender : la implementación de la tabla de secuencias: se busca programador

Implementación de pila

definición

La posición inicial, la posición superior de la pila (operando con subíndices) y la capacidad.

typedef struct Stack
{
	Datatype* a;
	int top;   //栈顶位置
	int capacity;   //容量
}ST;

inicialización

La posición inicial está vacía, la capacidad es 0 y la parte superior de la pila está en la posición del subíndice 0.

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

destruir

Suelte desde la posición inicial, porque el espacio se abre continuamente, liberar la posición inicial liberará todo el espacio abierto

capacidad y pila superior 0

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

empujar la pila

Después de la afirmación, primero debe verificar si la capacidad es suficiente. Si el espacio no es suficiente, necesita reasignar espacio. Si el espacio es insuficiente, le dará 4 tipos de datos de espacio. Si no es igual a 0, se le dará el doble del tamaño del espacio existente.

Una vez resuelto el espacio, almacene los datos y actualice la parte superior de la pila.

//压栈
void StackPush(ST* ps, Datatype x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->a = realloc(ps->a, newcapacity*sizeof(Datatype));
		if (ps->a == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

estallido

Cabe señalar que no solo se debe afirmar ps, sino que también la parte superior de la pila debe ser mayor que 0, es decir, la pila no está vacía.

Debido a que el espacio abierto es continuo y no se puede liberar por separado, podemos actualizar directamente la parte superior de la pila.

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top>0);
	ps->top--;
}

Comprobar si la pila está vacía

Devuelve verdadero si está vacío, devuelve falso si no está vacío

//判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	//if (ps->top > 0)
	//{
	//	return false;
	//}
	//else
	//{
	//	return true;
	//}
	return ps->top == 0;
}

 número de datos

El número de datos es directamente el subíndice de la parte superior de la pila

//数据个数
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

acceder al elemento superior de la pila

El elemento superior de la pila es el anterior a la parte superior de la pila, y top-1 es el subíndice del elemento superior de la pila.

//访问栈顶数据
Datatype StackTop(ST* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}

archivo principal

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef int Datatype;

typedef struct Stack
{
	Datatype* a;
	int top;   //栈顶位置
	int capacity;   //容量
}ST;

void StackInit(ST* ps);

void StackDestory(ST* ps);

void StackPush(ST* ps,Datatype x);

void StackPop(ST* ps);

//判断栈是否为空
bool StackEmpty(ST* ps);

//数据个数
int StackSize(ST* ps);

//访问栈顶数据
Datatype StackTop(ST* ps);

archivo de prueba 

#include "Stack.h"


void TestStack()
{
	ST st;
	StackInit(&st);
	StackPush(&st,1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);

	while (!StackEmpty(&st))
	{
		printf("%d ",StackTop(&st));
		StackPop(&st);
	}

	StackDestory(&st);
}



int main()
{
	TestStack();
	return 0;
}

Todavía puede empujar y abrir la pila de acuerdo con sus propias necesidades, ¡y se implementa la pila simple! !

 

Supongo que te gusta

Origin blog.csdn.net/weixin_53316121/article/details/123744876
Recomendado
Clasificación