栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

其实这就是一个数组,栈底的初始化是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->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); //判断栈顶是否为空
// 但是我如果不是空的情况咋不考虑呢
//其实没有必要的
//有的人这样写的

}

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 
#include 
#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 
#include 
#include 
#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]);
}

分享到这了,谢谢。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号