首页 > 其他分享 >【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)

【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)

时间:2022-10-16 21:00:29浏览次数:52  
标签:ps top 栈顶 C语言 assert STDataType 数据结构 Stack 接口函数

1、栈的定义

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶

【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)_数组

2、栈的实现形式

(1)栈使用哪种形式实现好?

答:数组和链表都可以实现

1、用数组实现,用数组的尾去做栈顶非常合适,用数组实现栈相当于之前顺序表中的尾插尾删,唯一的缺陷和不足为:空间不够的话需要增容

2、用链表实现,如果用单链表实现,则需要用链表表头head做栈顶,用头删头插做入栈和出栈,这样的时间复杂度都为O(1)

如果用双向链表实现的话,则用链表尾节点做栈顶更为合适。

但综合比较下来,用数组更为合适,效率更高,CPU缓存命中更高。

此时我们应该用静态数组还是动态数组呢?

这种是静态,不太好控制MAX的大小,可能会造成浪费或者不够反复扩容,所以我们写成动态

#pragma once
#include<stdio.h>
typedef int STDataType;
#define MAX 100
typedef struct Stack
{
STDataType a[MAX];
int top;
}Stack;

动态:

pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>//一定不能为空的东西,可以考虑用断言来处理。
#include<stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}Stack;

3、用C语言实现栈的接口函数

我们总共实现如下这些接口函数

void StackInit(Stack* ps);//初始化栈
void StackDestory(Stack* ps);//摧毁栈
void StackPushBack(Stack* ps, STDataType x);//入栈
StackPop(Stack* ps);//出栈
STDataType StackTop(Stack* ps);栈顶元素
int StackSize(Stack* ps);
bool StackEmpty(Stack* ps);//空就返回1,非空就返回0

(1)初始化栈

void StackInit(Stack* ps)
{
ps->a = (STDataType*)malloc(sizeof(STDataType)* 4);
if (ps->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}

ps->capacity = 4;
ps->top =0 ;//top这里可以给0也可以给-1,给0的话,top始终指向新插入栈顶的数据的下一个
//给-1的话,他就能插入哪个就给哪个。
}

(2)摧毁栈

void StackDestory(Stack* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}

(3)入栈

【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)_数据结构_02

void StackPush(Stack* ps, STDataType x)//入栈,栈只需要在栈顶进行操作,栈顶插入删除数据,
{
assert(ps);
if (ps->top == ps->capacity)
{
STDataType*tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
else
{
ps->a = tmp;
ps->capacity = ps->capacity*2 ;
}
}
ps->a[ps->top] = x;
ps->top++;
//ps->top++;
//ps->a[ps->top] = x;
//如果初始化那里top设置为-1,则用下面这种方式
}

(4)出栈

【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)_出栈_03

STDataType StackPop(Stack* ps)//出栈
{
assert(ps);//栈空了,再调用POP,直接报错
assert(ps->top > 0);
ps->top--;
return ps->a[ps->top-1];
}

(5)找栈顶元素

STDataType StackPop(Stack* ps)//出栈
{
assert(ps);//栈空了,再调用POP,直接报错
assert(ps->top > 0);
ps->top--;
return ps->a[ps->top-1];
}

(6)求栈的大小

int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}

(7)判断栈是否为空

bool StackEmpty(Stack* ps)
{
assert(ps);
return ps->top == 0;
}//空就返回1,非空就返回0

标签:ps,top,栈顶,C语言,assert,STDataType,数据结构,Stack,接口函数
From: https://blog.51cto.com/u_15100472/5760539

相关文章

  • 【数据结构】二叉树的概念和简单实现(仅供学习交流使用)
    1、树1、树的概念   树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝......
  • 【以练促学】(数据结构)1.绪论篇
    (持续刷题持续更新...) 1.数据结构的三要素:逻辑结构、物理结构、数据运算 eg.以下属于逻辑结构的( )A.顺序表   B.哈希表   C.有序表  D.单链......
  • 04 队列 | 数据结构与算法
    1.队列1.队列的概念队列:操作受限的线性表,只允许在一端进行元素的插入,另一端进行元素的删除空队列:不含有任何元素的队列队头和队尾:进行删除的一端叫队头front,进行插......
  • C语言入门1
    C语言初级阶段常量与变量1.常量:不能被改变的量,ex:1、2、3(1)整型常量:整数(2)实型常量:①十进制小数形式:数字和小数点组成②指数形式:12.34e3=10.34*103(3)字符常量:ex:’a'、......
  • 【C语言】操作数的优先级大小。
    ......
  • C语言实例2
    题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,提成7.5%;利润20万到4......
  • 【C语言有这个就够了】七.实用调试技巧
    (一)什么是BUG历史上第一个bug导致程序运行错误的对象(二)调试是什么调试就是破案的过程,因为有人写代码是这样的:1.调试又称除错,是发现和减少计算机程序或电子仪器设备中程序错误......
  • C语言循环
    #include<stdio.h>intmain(){int i=0;printf("去卖烤红薯\n");while(i<200){printf("卖出的烤红薯:%d\n",i);  i++;}if(i>=200)printf("成为千万富翁\n");  retu......
  • 用C语言实现两个值交换的四种方法
    一.题中已给两个值的数值二.随意输出两个整数(变量)的数值为避免麻烦,我在这里统一用变量(就是第二种)来敲一遍,希望可以给各位解决些麻烦,仅供参考,希望指正。另外,下面的代码我用了......
  • Persistent data structure 不可变数据结构
    持久性变数据不要和持久储存相混淆在计算机中持久性数据或非临时数据是一种数据结构,在修改时始终保持其自身的先前版本。这些数据实际上是不可变的,因为对这类数据操作不会......