栈的定义

1, 栈是一种特殊的线性表

2,栈仅能在线性表的一端进行操作

3,栈顶(Top): 允许操作的一端 允许操作的一端

4,栈底(Bottom): ,不允许操作的一端 不允许操作的一端

这里我做出了 栈的顺序实现 和 链式实现,分别如下:

=========================================华丽丽的分割线==========================================================

栈的顺序实现:

首先,我们要弄明白的是,栈本质上就是线性表,是一种特殊的线性表,只是只能在一端进行操作罢了,故而很多操作线性表是很类似的。因此,我们可以将之前写的

顺序线性表的实现及操作(C语言实现)

中的代码直接拿过来使用,以达到代码复用的效果(代码就不在此处追述了)。

头文件:

#ifndef _SEQSTACK_H_

#define _SEQSTACK_H_

typedef void SeqStack;

SeqStack* SeqStack_Create(int capacity);

void SeqStack_Destroy(SeqStack* stack);

void SeqStack_Clear(SeqStack* stack);

int SeqStack_Push(SeqStack* stack, void* item);

void* SeqStack_Pop(SeqStack* stack);

void* SeqStack_Top(SeqStack* stack);

int SeqStack_Size(SeqStack* stack);

int SeqStack_Capacity(SeqStack* stack);

#endif

源文件: // 栈.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include "SeqStack.h"

#include "SeqList.h"

int _tmain(int argc, _TCHAR* argv[])

{

SeqStack* stack = SeqStack_Create(20);

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

SeqStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)SeqStack_Top(stack));

printf("Capacity: %d\n", SeqStack_Capacity(stack));

printf("Length: %d\n", SeqStack_Size(stack));

while( SeqStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));

}

SeqStack_Destroy(stack);

system("pause");

return 0;

}

//创建栈

SeqStack* SeqStack_Create(int capacity)

{

return SeqList_Create(capacity);

}

//销毁

void SeqStack_Destroy(SeqStack* stack)

{

SeqList_Destroy(stack);

}

//清空

void SeqStack_Clear(SeqStack* stack)

{

SeqList_Clear(stack);

}

//压栈

int SeqStack_Push(SeqStack* stack, void* item)

{

return SeqList_Insert(stack, item, SeqList_Length(stack));

}

//弹栈

void* SeqStack_Pop(SeqStack* stack)

{

return SeqList_Delete(stack, SeqList_Length(stack) - 1);

}

//获得栈顶

void* SeqStack_Top(SeqStack* stack)

{

return SeqList_Get(stack, SeqList_Length(stack) - 1);

}

//栈的大小

int SeqStack_Size(SeqStack* stack)

{

return SeqList_Length(stack);

}

//顺序栈的总大小

int SeqStack_Capacity(SeqStack* stack)

{

return SeqList_Capacity(stack);

}

运行结果: Top: 9

Capacity: 20

Length: 10

Pop: 9

Pop: 8

Pop: 7

Pop: 6

Pop: 5

Pop: 4

Pop: 3

Pop: 2

Pop: 1

Pop: 0

请按任意键继续. . .

=====================================我是分割线========================================================

栈的链式实现:

同栈的顺序实现一样,栈的链式实现本质上其实就是单链表的形式,也只是在一头操作罢了,因此我们这里亦采用代码复用的方法,具体代码请参阅:

头文件:

#ifndef _LINKSTACK_H_

#define _LINKSTACK_H_

typedef void LinkStack;

LinkStack* LinkStack_Create();

void LinkStack_Destroy(LinkStack* stack);

void LinkStack_Clear(LinkStack* stack);

int LinkStack_Push(LinkStack* stack, void* item);

void* LinkStack_Pop(LinkStack* stack);

void* LinkStack_Top(LinkStack* stack);

int LinkStack_Size(LinkStack* stack);

#endif

源文件: #include "stdafx.h"

#include "LinkList.h"

#include "LinkStack.h"

#include

#include

int main(int argc, char *argv[])

{

LinkStack* stack = LinkStack_Create();

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

LinkStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)LinkStack_Top(stack));

printf("Length: %d\n", LinkStack_Size(stack));

while( LinkStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));

}

LinkStack_Destroy(stack);

system("pause");

return 0;

}

typedef struct _tag_LinkStackNode

{

LinkListNode header;

void* item;

} TLinkStackNode;

//创建

LinkStack* LinkStack_Create()

{

return LinkList_Create();

}

//销毁

void LinkStack_Destroy(LinkStack* stack)

{

LinkStack_Clear(stack);

LinkList_Destroy(stack);

}

//清空

void LinkStack_Clear(LinkStack* stack)

{

while( LinkStack_Size(stack) > 0 )

{

LinkStack_Pop(stack);

}

}

//压栈

int LinkStack_Push(LinkStack* stack, void* item)

{

TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));

int ret = (node != NULL) && (item != NULL);

if( ret )

{

node->item = item;

ret = LinkList_Insert(stack, (LinkListNode*)node, 0);

}

if( !ret )

{

free(node);

}

return ret;

}

//出栈

void* LinkStack_Pop(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

free(node);

}

return ret;

}

//获得栈顶

void* LinkStack_Top(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

}

return ret;

}

//获得栈的大小

int LinkStack_Size(LinkStack* stack)

{

return LinkList_Length(stack);

}

运行结果:

Top: 9

Length: 10

Pop: 9

Pop: 8

Pop: 7

Pop: 6

Pop: 5

Pop: 4

Pop: 3

Pop: 2

Pop: 1

Pop: 0

请按任意键继续. . .

如有错误,望不吝指出~

笔试c语言实现栈,栈的实现与操作(C语言实现)相关推荐

  1. go语言mysql删除记录_MySQL数据库删除操作-Go语言中文社区

    删除数据库 DROP DATABASE [IF EXISTS] 数据库名; 例如:删除school数据库 IF EXISTS 为可选,判断是否存在,如果不存在则会抛出异常 删除数据表 DROP TAB ...

  2. 数据结构源码笔记(C语言):栈的基本操作

    #include <stdio.h> #define MaxSize 100typedef char ElemType;typedef struct {char stack[MaxSize ...

  3. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  4. java语言链栈_Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行 ...

  5. 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  6. 如何轻松使用 C 语言实现一个栈?​

    作者 | 写代码的篮球球痴 什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你 ...

  7. c语言栈的实现以及操作_C++语言实现顺序栈

    在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以看看之前的文章,下面是链接C语言实现顺序栈在这 ...

  8. 浅谈C语言内存(栈)

    浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...

  9. C语言手写栈、手写计算器

    C语言实现表达式求值 文章结构 C语言手写栈Struct Stack 后缀表达式求值 中缀表达式转后缀表达式 文章结构 本文尝试通过纯C语言写一个计算器,在Visual Studio和VScode运行 ...

  10. (C语言)静态栈编写简单计算器(感悟与详细解析)

    C语言数据结构静态栈--计算器的实现 下面我来详细的解释一下我编写的计算器代码.... 有必要先说明一下的是,此代码中含有两个栈:数据栈和算符栈: 数据栈:存放double型数字: 算符栈:存放cha ...

最新文章

  1. 如何在SharePoint2010中添加Deep Zoom Image
  2. SSD(Single shot multibox detector)目标检测模型架构和设计细节分析
  3. redis.conf配置选项如下
  4. matlab基础入门之教你如何实现最小二乘法(附MATLAB代码)
  5. 三十五、深入Vue.js语法(下篇)
  6. 【mysq 5.7.31】远程访问权限(允许远程连接)
  7. socket和IOCTL结合实现网络采集
  8. 施一公谈自己35岁和53岁的区别
  9. Google Earth的十个常用技巧应用
  10. led灯光衰怎么解决_花小钱办大事 主流直插式LED大灯横评
  11. IOS APP 上传到AppStore
  12. 拓扑链表c语言,数据结构2.2 链表的实现
  13. 看单片机原理图-电源电路
  14. android timepicker 设置颜色,android – 更改TimePicker文本颜色
  15. 如何做一名优秀的工程师
  16. iOS内购-防越狱破解刷单
  17. 算法基础课【合集1】
  18. win10 ST-GCN复现
  19. 网络爬虫与机器学习算法在城市分析中的应用(python)
  20. 2021年压力容器作业R2移动式压力容器充装证考试题库

热门文章

  1. Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!
  2. C/C++ 格式化读取和读取一行
  3. SpaceNet 数据集
  4. gis数据与cad数据转换之间的关系
  5. 【树】Unique Binary Search Trees II
  6. 又延伸到socket去了。
  7. HTML5学习笔记简明版(1):HTML5介绍与语法
  8. ue4是什么意思_UE4 C++基础教程 - 资源常见名词解释
  9. 分布式事务之基础理论(CAP/BASE理论)篇
  10. Java中的DES加密与解密工具类