Estrutura de dados C/C++ --- pilha

Pagina inicial

Ainda há incógnitas esperando para serem exploradas_Estrutura de dados, dificuldades na linguagem C, pequenos projetos-CSDN Blog

Coluna de tópico --- estrutura de dados

Estrutura de dados_Ainda existem blogs desconhecidos esperando para serem explorados-CSDN Blog

Índice

I. Introdução

2. Operações básicas (pilha --- estrutura de armazenamento sequencial)

1. Inicialização da pilha sequencial

1. O primeiro tipo de dados da pilha

2. O segundo tipo de dados da pilha

 2. Determine se a pilha está vazia (então escreva com o primeiro tipo de dados)

3. Determine se a pilha está cheia

4. Encontre o comprimento da pilha

5. Empurre para a pilha

6. Saia

3. Vantagens

4. Código total 


I. Introdução

A pilha é uma tabela linear especial. As operações básicas da pilha são push e pop, de acordo com o princípio último a entrar, primeiro a sair . A pilha só pode ser inserida e excluída em uma extremidade. Esta extremidade da operação é chamada de elemento superior da pilha, e a outra extremidade da pilha é chamada de elemento inferior da pilha, e um ponteiro no topo da pilha é usado para armazenar o subscrito do elemento superior da pilha. Quando não há elementos na pilha, ela é chamada de pilha vazia.

2. Operações básicas (pilha --- estrutura de armazenamento sequencial)

1. Inicialização da pilha sequencial

A inicialização da pilha sequencial consiste em construir uma lista vazia.

O primeiro tipo de dados de pilha não precisa abrir espaço para o array armazenar os dados, o segundo tipo abre espaço para o array no heap e é alocado dinamicamente , o que pode melhorar a utilização do array!

1. O primeiro tipo de dados da pilha

O tipo mais básico de pilha é escrito da seguinte forma:

typedef int elemtype;
#define MAX 1000
//最基础的栈的数据类型
struct LNode1
{
	elemtype data[MAX];//存数据
    int MaxSize;//存数组最大容量
	int top;//存栈顶元素的数组下标
};
struct LNode1* Init_SequenStack2(int MaxSize)
{
	struct LNode1* s = (struct LNode1*)malloc(sizeof(struct LNode1));//给整个类型开辟空间
	s->top = -1;
	s->MaxSize = MaxSize;
	return s;
}

2. O segundo tipo de dados da pilha

typedef int elemtype;
#define MAX 1000
//从PTA题中学到的站的数据类型定义
struct LNode2
{
	elemtype* data;//存数组空间的地址(需要自己开辟空间)
    int MaxSize;//存数组最大容量
	int top;//存栈顶元素的数组下标
};
//初始化
struct LNode2* Init_SequenStack2(int MaxSize)
{
	struct LNode2* s = (struct LNode2*)malloc(sizeof(struct LNode2));//给整个类型进行开辟空间
	s->data = (elemtype*)malloc(sizeof(elemtype));//给数组开辟空间
	s->top = -1;
	s->MaxSize = MaxSize;
	return s;
}

 2. Determine se a pilha está vazia (então escreva com o primeiro tipo de dados)

Determine o valor do ponteiro superior da pilha. Se for -1, retorne 0; se não for -1, retorne 1.

int SequenStack_Empty(struct LNode1* s)
{
	if (s->top == -1)//判断栈顶指针的值,为-1,返回0;不为-1,返回1
	{
		printf("栈空\n");
		return 0;
	}
	return 1;
}

3. Determine se a pilha está cheia

Determine o valor do ponteiro superior na pilha, que é MaxSize-1, e retorne 0; caso contrário, retorne 1

int SequenStack_Full(struct LNode1* s)//判满函数
{
	if (s->top == s->MaxSize - 1)
	{
		printf("栈满\n");
		return 0;
	}
	return 1;
}

4. Encontre o comprimento da pilha

int SequenStack_Length(struct LNode1* s)//长度函数
{
	return s->top + 1;
}

5. Empurre para a pilha

 Primeiro, certifique-se de que a pilha não esteja cheia, primeiro ++ o ponteiro superior da pilha e, em seguida, execute a operação de atribuição.

int SequenStack_Push(struct LNode1* s,int X)//入栈函数
{
	int ret = SequenStack_Full(s);
	if (ret == 0)//入栈失败
	{
		return 0;
	}
	else
	{
		s->data[++s->top] = X;
		return 1;
	}
}

6. Saia

 Para garantir que a pilha não esteja vazia primeiro, altere o ponteiro superior da pilha para -- e, em seguida, execute a operação de atribuição.

int SequenStack_Pop(struct LNode1* s)//出栈函数
{
	int flag = SequenStack_Empty(s);
	if (flag == ERROR)
	{
		return 0;
	}
	else
	{
		return s->data[s->top--];
	}
}

3. Vantagens

A complexidade de tempo de todas as operações acima é O(1) 

4. Código total 

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
#define MAX 1000
#define ERROR 1e8
//从PTA题中学到的站的数据类型定义
struct LNode2
{
	elemtype* data;//存数组空间的地址(需要自己开辟空间)
	int MaxSize;//存数组最大容量
	int top;//存栈顶元素的数组下标
};
//最基础的栈的数据类型
struct LNode1
{
	elemtype data[MAX];//存数据
	int MaxSize;//存数组最大容量
	int top;//存栈顶元素的数组下标
};
struct LNode1* Init_SequenStack1(int MaxSize);//struct LNode1类型的创建
struct LNode2* Init_SequenStack2(int MaxSize);//struct LNode2类型的创建
int SequenStack_Empty(struct LNode1* s);//判空函数
int SequenStack_Full(struct LNode1* s);//判满函数
int SequenStack_Length(struct LNode1* s);//判满函数
int SequenStack_Push(struct LNode1* s,int X);//入栈函数
int SequenStack_Pop(struct LNode1* s);//出栈函数
int main()
{
	int MaxSize;
	scanf("%d", &MaxSize);
	struct LNode1* s1 = Init_SequenStack1(MaxSize);
	int len = SequenStack_Length(s1);
	int X;
	scanf("%d", &X);
	if (SequenStack_Push(s1,X))
	{
		printf("入栈成功\n");
	}
	else
	{
		printf("入栈失败\n");
	}
	int ret = SequenStack_Pop(s1);
	if (ERROR == ret)
	{
		printf("出栈失败\n");
	}
	else
	{
		printf("%d出栈成功",ret);
	}
	return 0;
}
int SequenStack_Pop(struct LNode1* s)//出栈函数
{
	int flag = SequenStack_Empty(s);
	if (flag == ERROR)
	{
		return 0;
	}
	else
	{
		return s->data[s->top--];
	}
}
int SequenStack_Push(struct LNode1* s,int X)//入栈函数
{
	int ret = SequenStack_Full(s);
	if (ret == 0)//入栈失败
	{
		return 0;
	}
	else
	{
		s->data[++s->top] = X;
		return 1;
	}
}
int SequenStack_Length(struct LNode1* s)//长度函数
{
	return s->top + 1;
}
int SequenStack_Full(struct LNode1* s)//判满函数
{
	if (s->top == s->MaxSize - 1)
	{
		printf("栈满\n");
		return 0;
	}
	return 1;
}
int SequenStack_Empty(struct LNode1* s)
{
	if (s->top == -1)//判断栈顶指针的值,为-1,返回0;不为-1,返回1
	{
		printf("栈空\n");
		return ERROR;
	}
	return 1;
}
struct LNode1* Init_SequenStack1(int MaxSize)
{
	struct LNode1* s = (struct LNode1*)malloc(sizeof(struct LNode1));
	s->top = -1;
	s->MaxSize = MaxSize;
	return s;
}
struct LNode2* Init_SequenStack2(int MaxSize)
{
	struct LNode2* s = (struct LNode2*)malloc(sizeof(struct LNode2));
	s->data = (elemtype*)malloc(sizeof(elemtype));
	s->top = -1;
	s->MaxSize = MaxSize;
	return s;
}

Obrigado por seu apoio! !

おすすめ

転載: blog.csdn.net/qq_73435980/article/details/133394304