C/C++数据结构---栈

个人主页

仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客

专题分栏---数据结构

数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、前言

二、基本操作(栈---顺序存储结构)

1.顺序栈的初始化

1.栈的第一种数据类型

2.栈的第二种数据类型

 2.判断栈空(接下来用第一种数据类型写)

3.判断栈满

4.求栈的长度

5.入栈

6.出栈

三、优势

四、总代码 


一、前言

栈是一种特殊的线性表,栈的基本操作只有入栈和出栈,按照后进先出的原则。栈只能在一端进行插入和删除,该操作端称为栈顶元素,栈的另一端称为栈底元素,并且用一个栈顶指针来进行存储栈顶元素的下标。当栈中没有元素的时候称为空栈。

二、基本操作(栈---顺序存储结构)

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;
}

谢谢大家的支持!!! 

猜你喜欢

转载自blog.csdn.net/qq_73435980/article/details/133394304