两种实现栈ADT的方式

栈是一种先进后出或说是后进先出的数据结构,书中介绍了两种简单实现方法,其中使用链表的是比较方便的方式,而是用数组的方式效率比较高,但是需要初始化的时候指明最大数组元素上限个数。

下面是简单实现:

1.

链表方式

ListStack.cpp

 1 /*栈的数组实现*/
 2 #include "iostream"
 3 #include "stdlib.h"
 4
 5 #define log(s); std::cout<<s<<std::endl;
 6
 7 typedef struct _stack_
 8 {
 9     int data;
10     struct  _stack_ *pre;
11 }stack;
12
13 void pop(stack *&s)
14 {
15     stack *tmp=nullptr;
16     if (s == nullptr) /*为空栈的时候*/
17     {
18         log("栈为空,没有数据可以出栈");
19         return;
20     }
21     tmp = s;
22     s = s->pre;
23     free(tmp);
24     return;
25 }
26
27 void push(stack *&s,int data)
28 {
29     stack *p = (stack *)malloc(sizeof(stack));
30     p->data = data;
31     p->pre = nullptr;
32     p->pre = s;
33     s = p;
34     return;
35 }
36
37 int top(stack *s)
38 {
39     if (s == nullptr)
40     {
41         std::cout << "栈为空,return ";
42         return -1;
43     }
44     return s->data;
45 }
46
47 void empty(stack *&s)
48 {
49     stack *tmp=nullptr;
50     while (s->pre != nullptr)
51     {
52         tmp = s;
53         s = s->pre;
54         free(tmp);
55     }
56     s = nullptr;
57 }
58
59 int main()
60 {
61     stack *s = nullptr;
62     push(s, 1);
63     push(s, 2);
64     empty(s);
65     log(top(s));
66     pop(s);
67     system("pause");
68     return 0;
69 }

2.

数组实现

ArrayStack.cpp

  1 /*栈的链表实现*/
  2 #include "iostream"
  3 #include "stdlib.h"
  4
  5 #define  minSize 5
  6 #define  emptyStack -1
  7
  8 #define log(s); std::cout<<s<<std::endl;
  9
 10 typedef struct _stack_
 11 {
 12     int capacity;
 13     int topOfStack;
 14     int *Array;
 15 }stack;
 16
 17 stack *createStack(int maxSize)
 18 {
 19     stack *s;
 20     if (maxSize < minSize)
 21     {
 22         log("Stack size is too small");
 23     }
 24     s = (stack *)malloc(sizeof(stack));
 25     s->Array = (int *)malloc(sizeof(int) * maxSize);
 26     s->capacity = maxSize;
 27     s->topOfStack = emptyStack;/*初始化为空栈*/
 28     return s;
 29 }
 30
 31 int isFull(stack *s)/*检测是否为满栈*/
 32 {
 33     if (s == nullptr)
 34     {
 35         log("the stack has not inital");
 36         return 1;
 37     }
 38     return s->topOfStack == s->capacity;
 39 }
 40
 41 int isEmpty(stack *s)/*是否为空栈*/
 42 {
 43     if (s == nullptr)
 44     {
 45         log("the stack has not inital");
 46         return 1;
 47     }
 48     return s->topOfStack == emptyStack;
 49 }
 50
 51 void push(stack *s, int data)/*压栈*/
 52 {
 53     if (isFull(s))
 54     {
 55         log("Full of Stack");
 56         return;
 57     }
 58     ++s->topOfStack;
 59     s->Array[s->topOfStack] = data;
 60 }
 61
 62 void pop(stack *s)/*弹出栈*/
 63 {
 64     if (isEmpty(s))
 65     {
 66         log("Out of Stack");
 67         return;
 68     }
 69     --s->topOfStack;
 70 }
 71
 72 int top(stack *s)/*访问栈顶元素*/
 73 {
 74     if (isEmpty(s))
 75     {
 76         std::cout << "Out of Stack,Code is ";
 77         return emptyStack;
 78     }
 79     return s->Array[s->topOfStack];
 80 }
 81
 82 void makeEmpty(stack *&s)/*置空栈*/
 83 {
 84     free(s->Array);
 85     free(s);
 86     s = nullptr;
 87 }
 88
 89 int main(void)
 90 {
 91     stack *s = createStack(10);
 92     push(s, 1);
 93     push(s, 2);
 94     push(s, 3);
 95     log(top(s));
 96     pop(s);
 97     log(top(s));
 98     pop(s);
 99     log(top(s));
100     pop(s);
101     log(top(s));
102     pop(s);
103     makeEmpty(s);
104     pop(s);
105     system("pause");
106     return 0;
107 }

如果有实现问题望读者不吝指出,谢谢。

以上。

时间: 2024-08-04 18:55:13

两种实现栈ADT的方式的相关文章

KbmMW两种查询结果集通讯方式

KbmMW本身可以用QueryService的方式进行远程数据查询,但是SmpileService同样具有很强的扩展性可以实现数据查询,下面展示两种基于SmpileService的远程数据查询方法,其原理都是利用TkbmMWSimpleService实现流的传输. 直接上代码了: 一.利用KbmMemTable: 服务端: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3

struts2中两种validation.xml的配置方式_百度文库

在struts中,根据配置的validation.xml文件进行页面输入项目的验证已经众所周知,本文介绍在struts2中两种validation.xml的配置方式.可以根据不同的需要进行不同的配置. 以下以login页面输入firstname,lastname,和age为例进行说明.struts.xml中,成功的话转向成功页面.不成功的话转回到原页面. 首先建立userbean文件.文件名:UserBean.java包:struts2.login.bean文件内容:package struts

js两种定义函数、继承方式及区别

一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function() { alert("i am B"); } 区别:code 前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义 二:js两种继承方式及区别 对象冒充 临时属性 call() apply() 原型链 code 继承应选哪种 code 三:实例 js两种定义

maven的两种可运行jar打包方式。1、内置依赖,2、外部依赖。

maven打可运行jar包的两种方式 maven常用的普通打包方式分为pom,jar,war等,至于这些打包类型就不介绍啦. 如果不进行特殊配置,那么打包出来的jar包是不可运行的.只能当作普通依赖包使用. 下面就介绍两种maven打可运行jar包的方式: 方式一:内置打包法 <plugins> <!-- 内置打包法 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 

常用的两种spring、mybatis 配置方式

在之前的文章中总结了三种方式,但是有两种是注解sql的,这种方式比较混乱所以大家不怎么使用,下面总结一下常用的两种总结方式: 一. 动态代理实现 不用写dao的实现类 这种方式比较简单,不用实现dao层,只需要定义接口就可以了,这里只是为了记录配置文件所以程序写的很简单: 1.整体结构图: 2.三个配置文件以及一个映射文件 (1).程序入口以及前端控制器配置 web.xml <?xml version="1.0" encoding="UTF-8"?> &

Android APP 两种用程序拨号的方式

想在APP中添加一个拨号功能该怎样做呢?Android提供了两种方式,一种是ACTION_CALL方式直接拨打,另一种是ACTION_DIAL方式打开系统的拨号界面. 下面我们来做个小例子 首先需要在AndroidManifest.xml中添加一个使用权限,这个容易忘哈哈. <uses-permission android:name="android.permission.CALL_PHONE" /> 然后搭一个简单的界面测试一下,下面是布局文件代码 <?xml ve

Nginx入门之两种handler函数的挂载方式

请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 接着上次的文章,今天研究<深入理解Nginx模块开发与架构解析>一书中给出的mytest的例子,发现和 /tengine.taobao.org/book/一书中的例子不甚相同,尤其是在handler函数的挂在方面. 函数的挂载分为两种方式: 一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载.tengine.taobao.org 中使用的挂载方式是按处理阶段挂载,而深入理解一书中的挂载方式是按需求挂载. 首先看/tengin

微信企业号两种常用搜索加载方式

微信企业端两种常用搜索方式 一:在搜索框中进行加载搜索结果 1.html部分代码和js部分代码 <div class="page__bd" style="height: 100%;"> <div class="weui-search-bar" id="searchBar"> <form class="weui-search-bar__form"> <div clas

php两种实现守护进程的方式

第一种方式,借助 nohup 和 &  配合使用. 在命令后面加上 & 符号, 可以让启动的进程转到后台运行,而不占用控制台,控制台还可以再运行其他命令,这里我使用一个while死循环来做演示,代码如下 <?php while(true){ echo time().PHP_EOL; sleep(3);} 用 & 方式来启动该进程[[email protected] php]# php deadloop.php &[1] 3454[[email protected] p