【数据结构】-栈的基本操作(源码可以直接运行)

这篇博客详细介绍了栈这一数据结构的实现,包括初始化、入栈、出栈、查看栈顶元素等基本操作。作者展示了如何使用C语言定义和管理顺序栈,并讨论了栈顶指针初始化为-1的原因。此外,还提供了完整的代码示例,包括栈的初始化、释放空间、判断栈的状态等功能。
摘要由CSDN通过智能技术生成

栈:是线性表的一种特殊的表现形式,与队列的“先来先服务不同”,栈执行的则是“后进先出”原则(如图所示)

那么在栈中则还应该注意的是什么呢? 操作流程 :栈只能在一段操作也就是在栈顶来进行操作的

其实这就是一个数组,栈底的初始化是base[0],然后依次往上加,到你的MAXSIZE元素。

那么函数怎样解释呢

SeqStack* SeqStackInit() //初始化,来进行分配空间
{
	SeqStack* p;
	if (p = (SeqStack*)malloc(sizeof(SeqStack)))
	{
		p->top = 0; //设置栈顶为0
		return p;
	}
	return NULL;
}

 但是有的是是这样写的

Status InitStack(SqStack *S)
{ 
    /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
    S->top=-1;
    return OK;
}
//为啥要让S.top(栈顶)来指向-1呢?
//因为初始化为空栈,然后规定空栈的时候指向-1,这样在有第一个元素入栈的时候栈顶指针就可以通过自加指向元素,从而避免其它判断,所以直接指向了-1.

下一步就是内存的释放了。(但是我查了一下,他们只是声明内存中堆和栈的五个区别,但是和我空间释放有啥关系嘞)栈的释放_chinaplus的博客-CSDN博客_释放栈

void SeqStackFree(SeqStack* s)
{
	if (s)
		free(s);//空间的释放
}

之后的函数就是来判断你的栈是否清空的情况了。

int SeqStackIsEmpty(SeqStack* s)
{
	return (s->top==0); //判断栈顶是否为空
// 但是我如果不是空的情况咋不考虑呢
//其实没有必要的
//有的人这样写的
/*if (S.top==-1)
        return TRUE;
    else
        return FALSE; */
}

void SeqStackClear(SeqStack* s)
{
	s->top = 0; //清空栈
}

int SeqStackIsFull(SeqStack* s)//判断栈是否已经满了
{
	return (s->top== SIZE);
}

其实少添加一个对于栈长度的返回,这个用函数 

return S.top+1;

 对自己栈插入一个元素

int SeqStackPush(SeqStack* s, DATA data)
{    
    if ((s->top + 1) > SIZE)
    {
        printf("栈溢出\n");
        return 0;
    }
    s->data[++s->top] = data;
    return 1;
    
}

 之后便是出栈的准备了。

DATA SeqStackPop(SeqStack* s)
{
	if (s->top == 0)
	{
		printf("栈为空!");
		exit(0);
	}  //有没有发现那个入栈和出栈十分的相似呀,他们首先是来判断,不同的只不过是返回值不一
	return (s->data[s->top--]);
}

返回栈顶元素

DATA SeqStackPeek(SeqStack* s)
{
	if (s->top == 0)
	{
		printf("栈为空!");
		exit(0);
	}
	return(s->data[s->top]);
}
//其实和入栈 出栈 几乎一样的

人家写的和我有出数据结构-栈_zxucver的博客-CSDN博客_数据结构栈

那么完全代码如下;

SeqStack.h

#define SIZE 50
typedef struct
{
	char name[15];
	int age;
}DATA;
typedef struct stack
{
	DATA data[SIZE + 1];
	int top;
	int base;
}SeqStack;
SeqStack* SeqStackInit();
void SeqStackFree(SeqStack* s);
int SeqStackIsEmpty(SeqStack* s);
void SeqStackClear(SeqStack* s);
int SeqStackIsFull(SeqStack* s);
int SeqStackPush(SeqStack* s,DATA data);
DATA SeqStackPop(SeqStack* s);
DATA SeqStackPeek(SeqStack* s);

SeqStack(main).c

#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
#include "SeqStack.h"
int main()
{
	SeqStack* stack;
	DATA data, data1;
	stack = SeqStackInit(); //初始化
	printf("入栈操作:\n");
	printf("输入姓名 年龄 入栈操作:");
	scanf("%s%d", data.name, &data.age);
	SeqStackPush(stack, data);
	printf("输入姓名 年龄 入栈操作");
	scanf("%s%d", data.name, &data.age);
	SeqStackPush(stack, data);
	printf("\n出栈操作:\n 任意键进行出栈操作:");//其实这个没有函数的
	getchar();
	data1 = SeqStackPop(stack);
	printf("出栈的数据是(%s,%d)\n", data.name, &data.age);
	SeqStackPeek(stack);
	getchar();
	return 0;
}   

SeqStack(函数设置部分).c

#include "SeqStack.h"
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50

SeqStack* SeqStackInit()
{
	SeqStack* p;
	if (p = (SeqStack*)malloc(sizeof(SeqStack)))
	{
		p->top = 0; //设置栈顶为0
		return p;
	}
	return NULL;
}

void SeqStackFree(SeqStack* s)
{
	if (s)
		free(s);//空间的释放
}

int SeqStackIsEmpty(SeqStack* s)
{
	return (s->top==0); //判断栈顶是否为空
}

void SeqStackClear(SeqStack* s)
{
	s->top = 0; //清空栈
}

int SeqStackIsFull(SeqStack* s)
{
	return (s->top== SIZE);
}

int SeqStackPush(SeqStack* s, DATA data)
{    
	if ((s->top + 1) > SIZE)
	{
		printf("栈溢出\n");
		return 0;
	}
	s->data[++s->top] = data;
	return 1;
	
}

DATA SeqStackPop(SeqStack* s)
{
	if (s->top == 0)
	{
		printf("栈为空!");
		exit(0);
	}
	return (s->data[s->top--]);
}

DATA SeqStackPeek(SeqStack* s)
{
	if (s->top == 0)
	{
		printf("栈为空!");
		exit(0);
	}
	return(s->data[s->top]);
}

分享到这了,谢谢。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i-阿松!

请给我一毛钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值