Pagina inicial
Coluna de tópico --- estrutura de dados
Estrutura de dados_Ainda existem blogs desconhecidos esperando para serem explorados-CSDN Blog
Índice
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
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! ! !