栈的实现与操作(C语言实现)
栈的定义
 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 <malloc.h>
#include <stdlib.h>
#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
请按随意键继续. . .
=====================================我是切割线========================================================
栈的链式实现:
同栈的顺序实现一样,栈的链式实现本质上事实上就是单链表的形式,也仅仅是在一头操作罢了,因此我们这里亦採用代码复用的方法,详细代码请參阅:链表的实现与操作(C语言实现) 。
头文件:
#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 <malloc.h>
#include <stdlib.h> 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语言]
是任意形式的递归,是化解的一般式. 主题所谓的“递归调用化解为栈处理”,意思是,将递归函数调用化解为“一个由stack_push stack_pop stack_top等函数调用组成的循环式子”.这里 ...
- neo4j初次使用学习简单操作-cypher语言使用
Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查 neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...
- 用LinkedList集合演示栈和队列的操作
在数据结构中,栈和队列是两种重要的线性数据结构.它们的主要不同在于:栈中存储的元素,是先进后出:队列中存储的元素是先进先出.我们接下来通过LinkedList集合来演示栈和队列的操作. import ...
- C语言描述栈的实现及操作(数组实现)
一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...
- C语言描述栈的实现及操作(链表实现)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...
- C++中栈结构建立和操作
什么是栈结构 栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:后进先出. 我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物. 而从数据的逻 ...
- 动态单链表的传统存储方式和10种常见操作-C语言实现
顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- python全栈开发day54-mysql库操作、表操作、数据类型、完整性约束
一.昨日内容回顾 1.mysql的安装 1).解压文件 添加环境变量bin 2).初始化mysql生成数据data文件夹: mysqld --initialize-insecure 3).mysqld ...
随机推荐
- WordPress主题开发:设置和获取浏览次数
将以下代码放在functions.php,一个是获取阅读量,一个是设置阅读量 <?php /** * getPostViews()函数 * 功能:获取阅读数量 * 在需要显示浏览次数的位置,调用 ...
- WordPress主题开发:截取标题或内容
截取可以用wp_trim_words() 用法: <?php $trimmed = wp_trim_words( $text, $num_words = 55, $more = null ); ...
- 探讨一下Java单例设计模式
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. ...
- HTML5文件上传qq、百度、taobao等比较(改进支持三种状态提示)
拖拽过程详解: 1:文件未拖出文件选择框的时候提示:将要上传的文件或文件夹拖拽至此区域 2:文件拖出文件选择框但未拖入上传的文件框提示:请继续拖拽文件或文件夹至此区域 3:文件拖出文件选择框且已拖入上 ...
- Android应用icon和闪屏splash的尺寸
icon (尺寸为px) 目录 尺寸 (width * height) drawable 72 x 72 drawable-hdpi 72 x 72 drawable-ldpi 36 x 36 dra ...
- Android Activity之间切换出现短暂黑屏的处理方法
转自:http://www.cppblog.com/fwxjj/archive/2013/01/14/197259.html 在默认情况下,Android应用程序启动时,会有一个黑屏的时期,原因是,首 ...
- VS Code搭建.NetCore开发环境(二)
一.安装VS Code for C#的相关插件 1.C# :https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp 2 ...
- 请简单介绍一下什么是Spring?
Spring的核心是一个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架,并提供 ...
- 从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" ...")中检测到有潜在危险的 Request.Form 值。
ylbtech-Error-WebForm:从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" . ...
- Identifier:GUID (全局唯一标识符)
ylbtech-Miscellaneos-Identifier:GUID (全局唯一标识符) A,返回顶部 1, 全局唯一标识符(GUID,Globally Unique Identifier)是一种 ...