在数据结构中,栈是一种桶状结构,每次往桶里放数据,最后放的数据最先被拿出来,最先放进去的数据最后才能出来(FILO)

C语言:

一、文件清单:

MyStack.h:

#ifndef _MYSTACK_H
#define _MYSTACK_H
#include <stdio.h>
#include <stdlib.h> typedef unsigned char bool;
#define true 1;
#define false 0; typedef int Elem;
typedef struct mystack
{
int iMaxSize;
int iLength;
Elem *Datas;
}MyStack; extern bool Stack_Init(MyStack* stack,int size);
extern bool Stack_Delete(MyStack *stack);
extern bool isStackEmpty(MyStack *stack);
extern bool isStackFull(MyStack *stack);
extern int Stack_size(MyStack *stack);
extern bool Stack_push(MyStack *stack,Elem data);
extern bool Stack_top(MyStack *stack,Elem *container);
extern bool Stack_bottom(MyStack *stack,Elem *container);
extern bool Stack_pop(MyStack *stack);
extern void Stack_printf(MyStack *stack); #endif

MyStack.c:

#include "MyStack.h"

bool Stack_Init(MyStack* stack,int size);
bool Stack_Delete(MyStack *stack);
bool isStackEmpty(MyStack *stack);
bool isStackFull(MyStack *stack);
int Stack_size(MyStack *stack);
bool Stack_push(MyStack *stack,Elem data);
bool Stack_top(MyStack *stack,Elem *container);
bool Stack_bottom(MyStack *stack,Elem *container);
bool Stack_pop(MyStack *stack);
void Stack_printf(MyStack *stack); bool Stack_Init(MyStack* stack,int size)
{
if(NULL != stack->Datas) //Stack has been init
return false;
stack->iMaxSize = size;
stack->iLength =;
stack->Datas = (Elem*)malloc(size * sizeof(Elem));
return true;
} bool Stack_Delete(MyStack *stack)
{
if(NULL == stack->Datas) //Stack does not exist
return false;
free(stack->Datas);
stack->Datas=NULL;
return true;
} bool isStackEmpty(MyStack *stack)
{
if(== stack->iLength)
{
return true;
}
return false ;
} bool isStackFull(MyStack *stack)
{
if(stack->iMaxSize == stack->iLength)
{
return true;
}
return false ;
} int Stack_size(MyStack *stack)
{
return stack->iLength;
} bool Stack_push(MyStack *stack,Elem data)
{
if(isStackFull(stack))
{
return false;
} stack->Datas[stack->iLength] = data;
stack->iLength++;
return true;
} bool Stack_top(MyStack *stack,Elem *container)
{
if(isStackEmpty(stack))
{
return false ;
} *container = stack->Datas[stack->iLength-];
return true;
} bool Stack_bottom(MyStack *stack,Elem *container)
{
if(isStackEmpty(stack))
{
return false;
} *container = stack->Datas[];
return true;
} bool Stack_pop(MyStack *stack)
{
if(isStackEmpty(stack))
{
return false;
} stack->iLength--;
return true;
} void Stack_printf(MyStack *stack)
{
int i;
printf("Stack:");
for(i=;i<stack->iLength;i++)
{
printf(" %d ",stack->Datas[i]);
}
printf(" \r\n");
}

main.c:

#include "MyStack.h"

int main()
{
MyStack stack={};
int top;
int bottom; //Stack_Init()
Stack_Init(&stack,); //Stack_push() and Stack_printf()
Stack_push(&stack,);
Stack_push(&stack,);
Stack_push(&stack,);
Stack_push(&stack,);
Stack_push(&stack,);
Stack_push(&stack,);
Stack_printf(&stack); //Stack_size()
printf("stack length:%d\r\n",Stack_size(&stack)); //Stack_top() Stack_bottom()
Stack_top(&stack,&top);
Stack_bottom(&stack,&bottom);
printf("stack top:%d,stack bottom:%d\r\n",top,bottom); //Stack_pop()
Stack_pop(&stack);
Stack_printf(&stack); Stack_pop(&stack);
Stack_pop(&stack);
Stack_pop(&stack);
Stack_pop(&stack);
Stack_pop(&stack);
Stack_pop(&stack);
Stack_printf(&stack); system("pause");
return ;
}

二、函数详解:

Stack_Init(MyStack* stack,int size)

bool Stack_Init(MyStack* stack,int size)
{
if(NULL != stack->Datas) //Stack has been init
return false;
stack->iMaxSize = size;
stack->iLength =;
stack->Datas = (Elem*)malloc(size * sizeof(Elem));
return true;
}
  1. 设置栈的最大深度iMaxSize;
  2. 因为栈中还没有数据,设置栈的的现有长度iLength为0;
  3. 使用malloc()函数为栈中的数据区*Datas分配空间;

Stack_Delete(MyStack *stack)

bool Stack_Delete(MyStack *stack)
{
if(NULL == stack->Datas) //Stack does not exist
return false;
free(stack->Datas);
stack->Datas=NULL;
return true;
}
  1. 栈如果已经被删除则返回
  2. 使用free()来回收分配的空间
  3. 将*Datas置为NULL

Stack_push(MyStack *stack,Elem data)

bool Stack_push(MyStack *stack,Elem data)
{
if(isStackFull(stack))
{
return false;
} stack->Datas[stack->iLength] = data;
stack->iLength++;
return true;
}
  1. 如果栈未满,往栈顶放入数据
  2. 增加栈的深度iLength来指示

Stack_top(MyStack *stack,Elem *container)

bool Stack_top(MyStack *stack,Elem *container)
{
if(isStackEmpty(stack))
{
return false ;
} *container = stack->Datas[stack->iLength-];
return true;
}
  1. 如果栈非空,在不删除任何东西的情况下获取栈顶的首个数据(这里注意数组下标减1)

Stack_pop(MyStack *stack)

bool Stack_pop(MyStack *stack)
{
if(isStackEmpty(stack))
{
return false;
} stack->iLength--;
return true;
}
  1. 如果栈非空,进行出栈操作,只需要把栈深度指示iLength减1

三、结果:

第一行:我们使用Stack_push()函数放入了1-6,6个整数,但是栈被设置的大小只有5,所以“6”没有入栈。调用printf()打印只能看到1到5。

第二行:调用Stack_size()函数获取到的栈深度为5。

第三行:此时栈中有5个数据,通过Stack_top()和Stack_bottom栈顶数据为“5”,栈底数据为“1”。

第四行:调用Stack_pop()函数进行出栈操作后5被移除,栈中剩下1-4,调用printf()打印出1-4

第五行:连续调用6次Stack_pop(),因为栈中只有4个元素,所以实际只有4次pop生效,调用printf()打印栈为空。

最后连续调用两次Stack_delete(),根据程序第二次会没有执行free(),所以程序没有发生崩溃。

C++语言:

一、文件清单:

包含两个文件,MyStack.h中用类模板实现Stack类

Main.c中为main测试程序

MyStack.h:

#ifndef _MYSTACK_H
#define _MYSTACK_H #include<iostream>
using namespace std; template <typename T>
class MyStack
{
public:
MyStack(int size);
~MyStack();
bool isStackEmpty();
bool isStackFull();
int getStackLength();
bool push(T data);
bool getTop(T *data);
bool getBottom(T *data);
bool pop();
void printf(); private:
T *m_tDatas;
int m_iMaxSize;
int m_iLength;
}; template <typename T>
MyStack<T>::MyStack(int size)
{
m_iMaxSize = size;
m_iLength = ;
m_tDatas = new T[size];
}
template <typename T>
MyStack<T>::~MyStack()
{
delete []m_tDatas ;
} template <typename T>
bool MyStack<T>::isStackEmpty()
{
if(!=m_iLength)
{
return false ;
}
return true;
} template <typename T>
bool MyStack<T>:: isStackFull()
{
if(m_iMaxSize != m_iLength)
{
return false;
}
return true;
} template <typename T>
int MyStack<T>::getStackLength()
{
return m_iLength;
} template <typename T>
bool MyStack<T>::push(T data)
{
if(!isStackFull())
{
m_tDatas[m_iLength]=data;
m_iLength++;
return true;
}
return false;
} template <typename T>
bool MyStack<T>::getTop(T *data)
{
if(!isStackEmpty())
{
*data = m_tDatas[m_iLength-];
return true;
}
return false ;
} template <typename T>
bool MyStack<T>::getBottom(T *data)
{
if(!isStackEmpty())
{
*data = m_tDatas[];
return true;
}
return false ;
} template <typename T>
bool MyStack<T>::pop()
{
if(!isStackEmpty())
{
m_iLength--;
return true;
}
return false ;
} template <typename T>
void MyStack<T>::printf()
{
cout<<"Stack:";
for(int i=;i<m_iLength;i++)
{
cout<<m_tDatas[i];
}
cout<<endl;
} #endif

main.cpp(用于测试)

#include <iostream>
#include "MyStack.h" using namespace std; int main()
{
MyStack<float> mystack();
float top;
float bottom; //push();
mystack.push(1.0f);
mystack.push(2.0f);
mystack.push(3.0f);
mystack.push(4.0f);
mystack.push(5.0f);
mystack.push(6.0f);
mystack.printf(); //getTop();getBottom()
mystack.getTop(&top);
mystack.getBottom(&bottom);
cout<<"top:"<<top<<", bottom:"<<bottom<<endl; //pop()
mystack.pop();
mystack.printf(); for(int i=;i<;i++)
{
mystack.pop();
}
mystack.printf(); system("pause");
return ;
}

二、函数详解:

构造函数:

template <typename T>
MyStack<T>::MyStack(int size)
{
m_iMaxSize = size;
m_iLength = ;
m_tDatas = new T[size];
}

m_iMaxSize 用于记录栈的最大深度,设置为输入值。

m_iLength用于记录栈的当前大小,构造时栈为空,所以置0。

m_tDatas为栈数据,这里为它分配空间。

push(T data):

template <typename T>
bool MyStack<T>::push(T data)
{
if(!isStackFull())
{
m_tDatas[m_iLength]=data;
m_iLength++;
return true;
}
return false;
}

如果栈还没满,就往栈顶放入数据,同时m_iLength++来指示栈的容量增加了。


getTop(T *data):

template <typename T>
bool MyStack<T>::getTop(T *data)
{
if(!isStackEmpty())
{
*data = m_tDatas[m_iLength-];
return true;
}
return false ;
}

如果栈非空,获取栈顶的数据,这里注意获取对应数据时,数组的下标减一。

pop():

template <typename T>
bool MyStack<T>::pop()
{
if(!isStackEmpty())
{
m_iLength--;
return true;
}
return false ;
}

如果栈非空,移除栈顶的数据,只需要改变m_iLength就能达到目的。

三、结果:

第一行:我们使用push()函数放入了1-6,6个浮点数,但是栈被设置的大小只有5,所以“6”没有入栈。调用printf()打印只能看到1到5。

第二行:此时栈中有5个数据,栈顶数据为“5”,栈底数据为“1”。

第三行:调用pop()函数进行出栈操作后5被移除,栈中剩下1-4,调用printf()打印出1-4

第四行:连续调用10次pop(),因为栈中只有4个元素,所以实际只有4次pop生效,调用printf()打印栈为空。

数据结构-栈 C和C++的实现的更多相关文章

  1. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

  2. C++ 泛型 编写的 数据结构 栈

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构   栈   记录下来,以备后用. 将 数据结构  栈   用头文件的形式 ...

  3. C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...

  4. 数据结构——栈的实现(数组、Java)

    巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...

  5. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  6. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  7. (js描述的)数据结构[栈结构](2)

    (js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...

  8. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  9. openssl stack 数据结构栈基本操作

    堆栈是两种不同的数据结构: 堆:数据先进先出: 栈:数据先进后观: 在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据. open ...

  10. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

随机推荐

  1. windows下wamp多域名的配置

    前面的话 本文将详细介绍windows下wamp多域名的配置方法 修改hosts文件 hosts文件的位置:系统盘→“windows”→“System32”→“drivers”→“etc” 打开hos ...

  2. 腾讯云安全:移动 APP 安全行业报告

    移动 APP 已逐步渗透入我们的生活,据统计,2016年,APP 发行数量仅电商.金融.游戏这三大类共计高达2万左右,国内移动互联网活跃用户数已经突破10亿,移动互联网这样快速的推移,移动互联网的安全 ...

  3. IntelliJ Idea 2017 注册码 免费激活方法

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.弹窗中选择最后一个页面license server,填入下面一种链接即可: http://idea.iteblog.co ...

  4. Python笔记·第九章—— 函数 (一)

    一.函数的作用 函数可以让我们代码结构更清晰,而且避免了代码的重复,冗余,使一段代码或者功能可以反复的被调用,大大提高了开发效率 二.函数的定义 def 函数名(参数1,参数2,*args,默认参数, ...

  5. Linux网络配置。Win10能ping虚拟机但虚拟机ping不通Win10,关闭Win10防火墙就好。

    仅主机模式:配置VMnet1与虚拟机在同一个网段 ifconfig查看网卡名: ifconfig ens33 192.168.1.2: ifconfig查看是否配置成功: 在Windows物理机上pi ...

  6. std::shared_ptr<void>的工作原理

    前戏 先抛出两个问题 如果delete一个指针,但是它真实的类型和指针类型不一样会发生什么? 是谁调用了析构函数? 下面这段代码会发生什么有趣的事情? // delete_diff_type.cpp ...

  7. Vue2 后台管理系统解决方案

    基于Vue.js 2.x系列 + Element UI 的后台管理系统解决方案. github地址:https://github.com/lin-xin/manage-system demo地址:ht ...

  8. IOS学习3——代理

    本文转载自:你真的了解iOS代理设计模式吗? 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存 ...

  9. tcpdump 命令详解

    TCPdump: dump  traffic on a network ,根据使用者的定义对网络上的数据包进行截获的一种包分析工具. TCPdump 可以讲网络中传送的数据包的 头信息完全截获下来提供 ...

  10. WebSocket协议:5分钟从入门到精通

    一.内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力.本文由浅入深,介绍了WebSocket如何建立连接.交换数据的细节,以及数据帧的格式.此外,还简要介绍了针对WebSocke ...