数据结构 之 栈(Stack)的实现及简单操作

news/2024/5/20 6:11:50 标签: 数据结构, , 顺序表, Stack

是限定仅在表尾进行插入和删除操作的线性表,由于只能在尾进行插入和删除,所以这里我们选用顺序表来实现更方便快捷一点

对于我们要做的有的初始化,入,出,查看顶元素,查看内元素个数,清空,打印


Stack.h:中对相关接口函数进行声明以及对的结构体进行定义

Stack.h:

#pragma once
#define NUM 50//的大小
typedef int DataType;

typedef struct Stack
{
	DataType* _array;
	size_t	_top; //顶 
	size_t	_end;
}Stack;

// 的实现接口 
void StackInit(Stack* s);//的初始化
void StackPush(Stack* s, DataType x);//入
void StackPop(Stack* s);//出
DataType StackTop(Stack* s);//查看顶元素
size_t StackSize(Stack* s);//内元素个数
int StackEmpty(Stack* s);//清空
void StackPrintf(Stack* s);//打印内元素(由底到顶)

这里用宏定义的大小

接着在Stack.c中对相关接口函数一一实现

Stack.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Stack.h"

void StackInit(Stack* s)//初始化
{
	s->_array = (DataType*)malloc(sizeof(DataType)*NUM);//malloc申请内存空间
	if (s->_array != NULL)
	{
		s->_end = s->_top = 0;
		return;
	}
	printf("初始化失败!!");
	return;
}

void StackPush(Stack* s, DataType x)//入
{
	assert(s);
	if (s->_top == NUM)
	{
		printf("stack overflow");//溢出
		return;
	}
	s->_array[s->_top] = x;
	s->_top++;
}

void StackPop(Stack* s)//出
{
	assert(s);
	s->_top--;
}

DataType StackTop(Stack* s) //顶元素
{
	assert(s);
	if (s->_top == 0)
	{
		printf("为空!!");
		return -1;
	}
	else
		return s->_array[s->_top- 1];
}

size_t StackSize(Stack* s)//内元素个数
{
	assert(s);
	return s->_top;
}

int StackEmpty(Stack* s)//清空
{
	s->_top = 0;
	return 0;
}

void StackPrintf(Stack* s)//打印内元素
{
	assert(s);
	rsize_t i = 0;
	for (i = 0; i < s->_top; i++)
	{
		printf("%-3d", s->_array[i]);
	}
	printf("\n");
}

int main()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	StackPush(&s, 5);
	StackPop(&s);
	StackPush(&s, 6);
	printf("内元素为:");
	StackPrintf(&s);
	printf("内元素个数为:%d\n", StackSize(&s));
	printf("顶元素为:%d\n", StackTop(&s));
	system("pause");
	return 0;
}

这里我们用宏定义的大小,需要注意的是因为的大小是一定的,所以在入时候要判断是否是满的,这里如果不加以判断就有可能造成访问越界,在这里当满时 屏幕打印 stack overflow

关于stack overflow这个问题我们在平时写递归时候如果不慎写出死循环之类的问题经常程序因为溢出而挂掉

int main()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	StackPush(&s, 5);
	StackPop(&s);
	StackPush(&s, 6);
	printf("内元素为:");
	StackPrintf(&s);
	printf("内元素个数为:%d\n", StackSize(&s));
	printf("顶元素为:%d\n", StackTop(&s));
	system("pause");
	return 0;
}

简单的对相关接口进行测试



http://www.niftyadmin.cn/n/905278.html

相关文章

做接口测试没反应

用postman做接口测试时&#xff0c;发现没有没有反应。不知道原因&#xff0c;郁闷了很久。 后来放到浏览器里试了下&#xff0c;发现是404,项目中服务命名和类名不一致导致的。转载于:https://www.cnblogs.com/Tpf386/p/10216236.html

[SHOI2008]小约翰的游戏

Description 小约翰经常和他的哥哥玩一个非常有趣的游戏&#xff1a;桌子上有n堆石子&#xff0c;小约翰和他的哥哥轮流取石子&#xff0c;每个人取的时候&#xff0c;可以随意选择一堆石子&#xff0c;在这堆石子中取走任意多的石子&#xff0c;但不能一粒石子也不取&#xff…

数据结构之 队列(Queue)的实现及简单操作

在生活中我们经常会遇到排队的事情&#xff0c;比如说排队买东西&#xff0c;大家依次站一个队&#xff0c;队头的人要比后面的人先买到东西&#xff0c;先到先得&#xff0c;然后买完东西就会离开这个队而我们平时为了解决在比如说打客服电话&#xff0c;排队叫号之类的应用问…

数据结构 之 带头循环双链表

在数据结构中我们经常会接触到链表&#xff0c;链表也分好多种&#xff0c;带头结点和不带头结点、循环和不循环、单向链表和双向链表而在众多不同结构的链表中 带头循环双链表可以说是一种最优的链表结构相比于单链表只能访问当前结点的后续结点的局限性&#xff0c;双链表既可…

oracle数据链接

using System; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace 数据链接 {public static class SqlHelper{#region 样本//标…

C语言如何在控制台窗口设置光标到指定位置

在用C语言写控制台的程序时&#xff0c;说到控制光标&#xff0c;我们通常就是回车换行或者空格之类的进行移动光标控制&#xff0c;但是这类操作只能是将光标移动到当前光标后面的位置&#xff0c;而且效率极低假设我们想要把光标移动到当前光标以前某个位置进行修改&#xff…

参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况

参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况。该值默认为0&#xff0c;表示当需要恢复时执行所有的恢复操作。当不能进行有效恢复时&#xff0c;如数据页发生了corruption&#xff0c;MySQL数据库可能会宕机&#xff0c;并把错误写入错误日志中。 但是&#…