数据结构
顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。在写顺序表的时候,需要对结构体有一定的了解(这里就不做过多的结构体介绍)
栈的定义
栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底。向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。
顺序栈
一、定义顺序栈
Ps:用顺序表来实现栈
typedef int ElemType;
#define STACKSIZE 10
typedef struct Stack
{
ElemType *data;
int top;
int stacksize;
}Stack,*StackPtr;
二、顺序栈所实现的功能
1.顺序栈初始化
int Init_Stack(StackPtr stack) //初始化
{
if(stack == NULL) exit(0);
stack->data = (ElemType*)malloc(sizeof(ElemType)*STACKSIZE);
stack->stacksize = STACKSIZE;
stack->top = 0;
return true;
}
2.入栈
int Push_Stack(StackPtr stack,ElemType val) //入栈
{
if(stack == NULL) exit(0);
stack->data[stack->top] = val;
stack->top++;
return true;
}
3.出栈
int Pop_Stack(StackPtr stack) //出栈
{
if(stack==NULL) exit(0);
stack->top--;
return true;
}
4.获得栈顶元素
int GetTop_Stack(StackPtr stack) //获取栈顶
{
if(stack == NULL) exit(0);
return stack->data[stack->top-1];
}
5.申请新空间
static int Apply_Stack(StackPtr stack) //申请空间
{
ElemType* p = (ElemType*)malloc(sizeof(ElemType)*stack->stacksize*2);
if(p == NULL) return false;
for(int i=0;i<stack->top;i++)
{
p[i] = stack->data[i];
}
free(stack->data);
stack->data = p;
p = NULL;
stack->stacksize*=2;
return true;
}
6.清空顺序栈
int Clear_Stack(StackPtr stack) //清空
{
if(stack == NULL) exit(0);
stack->top = 0;
return true;
}
7.销毁顺序栈
int Destroy_Stack(StackPtr stack) //销毁
{
if(stack == NULL) exit(0);
free(stack->data);
stack->data = NULL;
stack->top = 0;
stack->stacksize = 0;
return true;
}
8.判空
int Empty_Stack(StackPtr stack) //判空
{
if(stack == NULL) exit(0);
if(stack->top == 0)
{
return true;
}
else
{
return false;
}
}
9.判满
static int Full_Stack(StackPtr stack) //判满
{
if(stack->stacksize == stack->top&&stack->top != 0)
{
Apply_Stack(stack);
return true;
}
else
{
return false;
}
}
总代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;
#define STACKSIZE 10
typedef struct Stack
{
ElemType *data;
int top;
int stacksize;
}Stack,*StackPtr;
int Init_Stack(StackPtr stack) //初始化
{
if(stack == NULL) exit(0);
stack->data = (ElemType*)malloc(sizeof(ElemType)*STACKSIZE);
stack->stacksize = STACKSIZE;
stack->top = 0;
return true;
}
int Push_Stack(StackPtr stack,ElemType val) //入栈
{
if(stack == NULL) exit(0);
stack->data[stack->top] = val;
stack->top++;
return true;
}
int Pop_Stack(StackPtr stack) //出栈
{
if(stack==NULL) exit(0);
stack->top--;
return true;
}
int GetTop_Stack(StackPtr stack) //获取栈顶
{
if(stack == NULL) exit(0);
return stack->data[stack->top-1];
}
int Empty_Stack(StackPtr stack) //判空
{
if(stack == NULL) exit(0);
if(stack->top == 0)
{
return true;
}
else
{
return false;
}
}
static int Apply_Stack(StackPtr stack) //申请空间
{
ElemType* p = (ElemType*)malloc(sizeof(ElemType)*stack->stacksize*2);
if(p == NULL) return false;
for(int i=0;i<stack->top;i++)
{
p[i] = stack->data[i];
}
free(stack->data);
stack->data = p;
p = NULL;
stack->stacksize*=2;
return true;
}
static int Full_Stack(StackPtr stack) //判满
{
if(stack->stacksize == stack->top&&stack->top != 0)
{
Apply_Stack(stack);
return true;
}
else
{
return false;
}
}
int Clear_Stack(StackPtr stack) //清空
{
if(stack == NULL) exit(0);
stack->top = 0;
return true;
}
int Destroy_Stack(StackPtr stack) //销毁
{
if(stack == NULL) exit(0);
free(stack->data);
stack->data = NULL;
stack->top = 0;
stack->stacksize = 0;
return true;
}
int main()
{
//以下为测试------------------------------------
Stack st;
Init_Stack(&st);
for(int i=0;i<10;i++)
{
Push_Stack(&st,i);
}
printf("%d\n",GetTop_Stack(&st));
Pop_Stack(&st);
Pop_Stack(&st);
Pop_Stack(&st);
Pop_Stack(&st);
Pop_Stack(&st);
Pop_Stack(&st);
printf("%d\n",GetTop_Stack(&st));
Push_Stack(&st,10);
printf("%d\n",GetTop_Stack(&st));
return 0;
}