个人主页
仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客
专题分栏---数据结构
目录
一、前言
栈是一种特殊的线性表,栈的基本操作只有入栈和出栈,按照后进先出的原则。栈只能在一端进行插入和删除,该操作端称为栈顶元素,栈的另一端称为栈底元素,并且用一个栈顶指针来进行存储栈顶元素的下标。当栈中没有元素的时候称为空栈。
二、基本操作(栈---顺序存储结构)
1.顺序栈的初始化
顺序栈的初始化就是构造一个空表。
第一种栈的数据类型不需要给存数据的数组开辟空间,第二种给数组开辟空间是在堆上,且是动态开辟,更能使数组的利用率升高!
1.栈的第一种数据类型
栈的最基础的类型写法如下:
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.栈的第二种数据类型
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.判断栈空(接下来用第一种数据类型写)
判断栈顶指针的值,为-1,返回0;不为-1,返回1
int SequenStack_Empty(struct LNode1* s) { if (s->top == -1)//判断栈顶指针的值,为-1,返回0;不为-1,返回1 { printf("栈空\n"); return 0; } return 1; }
3.判断栈满
判断栈顶指针的值,为MaxSize-1,返回0;否则,返回1
int SequenStack_Full(struct LNode1* s)//判满函数 { if (s->top == s->MaxSize - 1) { printf("栈满\n"); return 0; } return 1; }
4.求栈的长度
int SequenStack_Length(struct LNode1* s)//长度函数 { return s->top + 1; }
5.入栈
首先要先保证栈不为满,先把栈顶指针++,然后再进行赋值操作
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.出栈
要先保证栈不为空,把栈顶指针--,然后再进行赋值操作
int SequenStack_Pop(struct LNode1* s)//出栈函数 { int flag = SequenStack_Empty(s); if (flag == ERROR) { return 0; } else { return s->data[s->top--]; } }
三、优势
以上所有的操作的时间复杂度均为O(1)
四、总代码
#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;
}
谢谢大家的支持!!!