数据结构之栈定义及基本操作实现

  终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽。

  根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点。

  接下来是栈的c语言实现。其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部。其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个结点的指针域构成,下面是结点的c语言实现:

1 /*
2 定义实现栈的结点
3 */
4 typedef struct Node{
5     int data;
6     struct Node * pNext;
7 }NODE,* PNODE;

  有了实现栈的结点,那么接下来就是该如何实现栈(具体的解释看代码):

1 /*
2 定义栈的结构,此处采用链表实现静态栈,所以仅仅需要给出栈的头部指针和底部指针即可
3 */
4 typedef struct Strack{
5     PNODE pTop;
6     PNODE pBottom;
7 }STRACK,* PSTRACK;

  栈的基本操作:栈的初始化,压栈、栈的遍历、出栈等操作  

 1 /*
 2 对栈初始化的函数
 3 对栈初始化仅仅是令栈中的top和bottom指针指向一个确定的地址,并且此地址指向的是栈的头结点(头结点的引入可以
 4 大大方便对栈的操作)。
 5 */
 6 void init_strack(PSTRACK pS){
 7     pS->pTop=(PNODE)malloc(sizeof(NODE));   //定义一个新结点,这个结点就是栈的头结点,并且让pTop指向这个结点
 8     if(pS->pTop==NULL){
 9         printf("内存分配失败");
10         exit(-1);
11     }
12     else{
13         pS->pBottom=pS->pTop;    //令bottom和top都指向头结点,则初始化栈完成,栈中没有任何有效结点
14         pS->pTop->pNext=NULL;
15     }
16
17 }
18
19 /*
20 压栈函数
21 因为栈具有“先进后出、后进先出”的特性,所以,在将元素压入栈时,也只能将栈压入栈的顶部
22 由此,压栈函数就是令栈的top指针指向新结点,新结点的指针域指向未压入栈时的最顶部的元素。
23 */
24 int push(PSTRACK pS,int val){
25     PNODE pNew=(PNODE)malloc(sizeof(NODE));  //定义一个新结点
26     if(pNew->pNext==NULL){
27         printf("内存分配失败");
28         exit(-1);
29     }
30     pNew->data= val;
31     pNew->pNext=pS->pTop;  //指针赋值的顺序不可以乱,为保证top所指向的地址不丢失,所以首先让新结点的指针域指向pS->pTop所指向的结点
32     pS->pTop=pNew;  //令top指针指向新的结点
33     return 0; //0表示当前push成功
34 }
35
36 /*
37 栈的遍历函数
38 因为只是遍历输出,所以不能破坏栈原有的结构,所以我们只有定义一个新的结点p,让其指向栈顶元素,
39 然后遍历下移一个输出其指向的元素的值 ,循环条件就是p=ps->pBottom
40 */
41 void traverse(PSTRACK ps){
42     PNODE p=ps->pTop;  //让新定义的结构体指针指向栈顶元素
43     while(p!=ps->pBottom){
44         printf("%d ", p->data);
45         p=p->pNext;  //让当前指针指向当前节点的下一个结点
46     }
47     printf("\n");
48     return;
49 }
50
51
52 /*
53 判断当前栈是否为空的函数
54 若为空,返回true
55 否则,返回false
56 */
57 bool isEmpty(PSTRACK ps){
58     if(ps->pTop==ps->pBottom){
59         return true;
60     }
61     else{
62         return false;
63     }
64 }
65
66 /*
67 弹栈函数:弹栈简单的说就是将第一个数值弹出,然后将ps->pTop指向原第一个结点的下一个结点(即弹栈后的第一个结点),
68 然后在将被弹出的元素在内存中释放掉。
69 */
70 bool pop(PSTRACK ps,int *pVal){
71     if(isEmpty(ps)){  //判断当前栈是否为空,若为空,则返回false
72         return false;
73     }
74     else{
75         PNODE p=ps->pTop;  //定义一个结点,这个结点在每次弹栈时都是指向栈顶,这样可以保证不会造成被弹出元素的丢失
76         ps->pTop=p->pNext;  //让top结点指向栈顶元素
77         *pVal=p->data;
78         free(p);  //将被弹出元素释放
79         p=NULL;
80         return true;
81     }
82 }

  上述就实现了对栈的基本操作,当然具体的应用还要看具体的算法要求。

时间: 2024-10-24 00:59:20

数据结构之栈定义及基本操作实现的相关文章

数据结构之队列定义及基本操作实现

数据结构学着就是有意思,真诚推荐郝斌老师的数据结构视频,真的讲解的非常详细,容易理解. 一直在跟着郝斌老师的数据结构视频学习,看完了队列的视频,记录下来,总结一下. 队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列.进行插入操作的一端称为队尾,进行删除操作的一端称为队尾. 队列的类型:链式队列,即用链表实现的队列.静态队列:即用数组实现的队列.在这里,我们采用用数组实现的静态队列.因为用链表实

数据结构之数组定义及基本操作

数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构.所谓的连续存储结构其实就是数组. 数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题.首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中.当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据.了解了以上知识后,我们就可以进行数组的设计了(我们就可以设计自己的数组供别人

数据结构 【实验7 二叉树基本操作】

实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 实验内容 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作.该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数. /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct Bit

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数据结构 【实验 串的基本操作】

一.实现主要功能为: 1.输入模式串.目标串 2.根据目标串生成next[]和nextval[]数组 3.根据next[]或者nextval[]进行匹配. 二.程序截图: 三.代码: 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 #define MAXSIZE 1000 //最大

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip