Linux C 数据结构——栈

还是先把这张图贴出来,以便对比和理解

  

  栈是限制在一段进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素称为“空栈”。特点:先进后出(FILO)。

栈顶即top,这里top有两种定义方式:

1、满栈(Full Stack),top指向最后一个使用的空间;

2、空栈(Empty Stack),top指向下一个可用的空间;

     栈也是线性表,所以也分顺序存储和链式存储:

一、顺序存储

       栈是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下表表示的栈顶指针top(相对指针)完成各种操作。

[cpp] view plaincopy
  1. typedef int data_t;  //定义栈中数据元素的数据类型  
  2. typedef struct  
  3. {  
  4.     date_t *data;  //用指针指向栈的存储空间  
  5.     int maxlen;    //当前栈的最大元素个数  
  6.     int top;  //指向栈顶位置(数组下标)的变量  
  7. }seqstack_t;  //顺序栈类型定义  


如图,我们可以看到,栈的顺序存储与顺序表的区别,顺序表数组大小是固定的,这样限制了我们的后期修改,而栈的顺序存储将数据域单独开辟了一片空间才存放,大小为maxlen*sizeof(data_t), 下面是栈的基本运算:

1、创建栈

[cpp] view plaincopy
  1. seqstack_t *CreateEmptyStack(int max_len)  
  2. {  
  3.     seqstack_t *stack;  
  4.     stack = (seqstack_t *)malloc(sizeof(seqstack_t));  
  5.     stack->data = (data_t *)malloc(sizeof(data_t)*max_len);  
  6.     stack->top = -1;  
  7.     stack->max_len = max_len;  
  8.   
  9.     return stack;  
  10. }  

2、摧毁一个栈

[cpp] view plaincopy
  1. void DestroyStack(seqstack_t *stack)  
  2. {  
  3.     if(stack != NULL)  
  4.     {  
  5.         if(stack->data != NULL)  
  6.             free(stack->data);  
  7.   
  8.         free(stack);  
  9.     }  
  10. }  

3、清空一个栈

[cpp] view plaincopy
  1. void ClearStack(seqstack_t *stack)  
  2. {  
  3.     if(stack != NULL)  
  4.         stack->top = -1;  
  5. }  

4、判断栈是否为空

[cpp] view plaincopy
  1. int EmptyStack(seqstack_t *stack)  
  2. {  
  3.     if(stack == NULL)  
  4.         return -1;  
  5.   
  6.     return(stack->top == -1 ? 1 : 0);  
  7. }  

5、判断栈是否为满

[cpp] view plaincopy
  1. int FullStack(seqstack_t *stack)  
  2. {  
  3.     if(stack == NULL)  
  4.         return -1;  
  5.   
  6.     return(stack->top == (stack->max_len - 1) ? 1 : 0);  
  7. }  

6、进栈

[cpp] view plaincopy
  1. int PushStack(seqstack_t *stack ,data_t x)  
  2. {  
  3.     if(FullStack(stack))  
  4.         return -1;  
  5.     else  
  6.     {  
  7.         stack->top++;  
  8.         stack->data[stack->top] = x;  
  9.     }  
  10.   
  11.     return 0;  
  12. }  

7、出栈

[cpp] view plaincopy
  1. int PopStack(seqstack_t *stack,data_t *x)  
  2. {  
  3.     if(EmptySqstack(stack))  
  4.         return -1;  
  5.     else  
  6.     {  
  7.         *x = stack->data[stack->top];  
  8.         stack->top--;  
  9.     }  
  10.   
  11.     return 0;  
  12. }  

8、取栈顶元素

[cpp] view plaincopy
  1. int GetTop(seqstack_t *stack,data_t *x)  
  2. {  
  3.     if(EmptyStack(stack))  
  4.         return -1;  
  5.     else  
  6.         *x = stack->data[stack->top];  
  7.   
  8.     return 0;  
  9. }  

 

二、链式存储

        若是栈中元素的数目变化范围较大或不清楚栈元素的数目,就应该考虑使用链式存储结构。人们将用链式存储结构表示的栈称作"链栈"。链栈通常用一个无头结点的单链表表示。如图所示:

插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针;

[cpp] view plaincopy
  1. typedef int data_t;  
  2. typedef struct node_t  
  3. {  
  4.     data_t data;  //数据域  
  5.     struct node_t *next;  //链接指针域  
  6. }linkstack_t; //链栈类型定义  

栈(链式存储)基本运算如下:

1、创建空栈:

[cpp] view plaincopy
  1. linkstack_t *CreateLinkstack()  
  2. {  
  3.     linkstack_t *top;  
  4.     top = (linkstack_t *)malloc(sizeof(linkstack_t));  
  5.     top->next = NULL;  
  6.       
  7.     return top;  
  8. }  

2、判断是否为空栈:

[cpp] view plaincopy
  1. int EmptyStack(linkstack_t *top)  
  2. {  
  3.     return (top->next == NULL ? 1 : 0);  
  4. }  

3、入栈

[cpp] view plaincopy
  1. void PushStack(linkstack_t *top,data_t x)  
  2. {  
  3.     linkstack_t *p;  
  4.     p = (linkstack_t *)malloc(sizeof(linkstack_t));  
  5.     p->data = x;  
  6.     p->next = top->next;  
  7.     top->next = p;  
  8.   
  9.     return;  
  10. }  

4、出栈

[cpp] view plaincopy
  1. int PopStack(linkstack_t stack,data_t *x)  
  2. {  
  3.     if(stack->next == NULL || stack == NULL)  
  4.         return -1;  
  5.   
  6.     linkstack_t p;  
  7.     p = stack->next;  
  8.     stack->next = p->next;  
  9.     if(x != NULL)  
  10.         *x = p->data;  
  11.     free(p);  
  12.   
  13.     return 0;  
  14. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的HTTP状态码

2019独角兽企业重金招聘Python工程师标准>>> 第一、成功的状态码: 1)200 OK – 服务器成功返回网页 2)304 Not Modified – 未修改 第二、失败的状态码: 3)404 Not F…

Linux C 数据结构——队列

还是先放这张图,以便对比和理解: 队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。特点:先…

如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间

1.安装FF的Firebug组件:点击FF的Tools的Add-ons菜单,输入Firebug关键字,并选择合适的版本Install。 2.安装完毕后地址栏右边会出现一个小虫图标,右边还有一个下拉箭头。如下图: 3.点击下拉箭头,选择“on fo…

Linux C 数据结构——二叉树

先放这张图: 可以看出,树是非线性结构; 一、树的概念 树(tree)是n(n>0)个节点的有限集合T,它满足两个条件: 1)有且仅有一个特定的称为根(root)的节点&…

Linux C 算法——查找

所谓“查找”记为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据,即在给定信息集上寻找特定信息元素的过程。 为了便于讨论,必须给出这个“特定的”词的确切含义。首先,引入一个“关键字”的概念&…

SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结

第一次SP项目总监遇到各种问题,以下是总结:问题1.创建SP项目的时候“场解决方案”跟“沙盒解决方案”是有区别的,具体可以看MSDN官方文档,这里简单摘抄如下:1)场解决方案:承载与W3WP.exe中&…

ECharts学习(1)--简单图表的绘制

1.获取ECharts 官网 下载&#xff1a;http://echarts.baidu.com/download.html 2.在html页面中引入ECharts文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>ECharts练习</title><script type"text/javas…

Linux C 算法——排序

排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的序列。 为了方便讨论&#xff0c;在此首先要对排序下一个确切的定义&#xff1a; 假设含有n个记录的序列为 { R1、R2、&#xff0c;。。。Rn } 其相应的关键字序列为 {K1、K2&#xff0c;。。。。Kn}…

JSON.parse 解析json字符串时,遇换行符报错

Json字符串转换成Json对象时候&#xff0c;有两种方式&#xff1a; 假设d是json字符串&#xff1a; 1&#xff0c;eval(( d ))。 2&#xff0c;JSON.parse(d)&#xff1b; 但是以上方式有隐患&#xff0c;如果Json字符串有换行的话&#xff0c;这样转换就会报错。 假如有…

文件I/O和标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O&#xff1a; 文件I/O&#xff1a;文件I/O称之为不带缓存的IO&#xff08;unbuffered I/O)。不带缓存指的是每个read&#xff0c;write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务&#xff0c;与os…

程序集、应用程序配置及App.config和YourSoft.exe.config .

转自&#xff1a;http://www.cnblogs.com/luminji/archive/2010/10/21/1857339.html 什么是程序集 程序集标识属性 强名称的程序集 强名称工作原理配置文件使用 DEVPATH 查找程序集指定要使用的运行库版本Appconfig和YourSoftexeconfig本章概要&#xff1a; 1&#xff1a;什么是…

[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

以下内容为原创&#xff0c;欢迎转载&#xff0c;转载请注明 来自天天博客&#xff1a;http://www.cnblogs.com/tiantianbyconan/p/6236646.html 在Dagger 2中使用RxJava来进行异步注入 原文&#xff1a;http://frogermcs.github.io/async-injection-in-dagger-2-with-rxjava 几…

关于Go语言在服务端做Restful接口和socket通信

请到我的个人博客看golang rest相关文章 http://xiaorui.cc关于Go语言在服务端做Restful接口和socket通信已经转到: http://xiaorui.cc/2014/10/25/%E5%85%B3%E4%BA%8Ego%E8%AF%AD%E8%A8%80%E5%9C%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%81%9Arestful%E6%8E%A5%E5%8F%A3%E5%92%8C…

UVa 11136 - Hoax or what

题目大意&#xff1a;超市进行促销活动&#xff0c;顾客可以把账单放到一个箱子里&#xff0c;每天超市会从箱子中抽出最高消费者和最低消费者&#xff0c;最高消费者可以得到&#xff08;最高消费-最低消费&#xff09;的金钱。询问超市在n天的促销活动结束后应支付多少钱。 找…

Winfrom实现圆角设计

主要代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void…

Linux 系统应用编程——进程基础

一、Linux下多任务机制的介绍 Linux有一特性是多任务&#xff0c;多任务处理是指用户可以在同一时间内运行多个应用程序&#xff0c;每个正在执行的应用程序被称为一个任务。 多任务操作系统使用某种调度(shedule)策略&#xff08;由内核来执行&#xff09;支持多个任务并发执行…

【Python文件处理】递归批处理文件夹子目录内所有txt数据

因为有个需求&#xff0c;需要处理文件夹内所有txt文件&#xff0c;将txt里面的数据筛选&#xff0c;重新存储。 虽然手工可以做&#xff0c;但想到了python一直主张的是自动化测试&#xff0c;就想试着写一个自动化处理数据的程序。 一.分析数据格式 需要处理的数据是txt格式存…

Windows Azure 之服务总线中继服务

Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点&#xff0c;在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务 而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的&#xff0c;而中继服务则可以充当很好的公共连…

【qt】QT 的信号与槽机制

QT 是一个跨平台的 C GUI 应用构架&#xff0c;它提供了丰富的窗口部件集&#xff0c;具有面向对象、易于扩展、真正的组件编程等特点&#xff0c;更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。 QT 支持下列平台&#xff1a;MS/WINDOWS-9…