【数据结构与算法】栈:顺序栈、链栈实现源码(Java&C)

[栈] 顺序栈SqStack-C实现 C语言实现顺序栈,并进行了封装,可保存命名为’SqStack.h’,即可调用 // Desc:顺序栈 // Time:20180819 // Vesion:0.0.1 #ifndef BASE #define BASE #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #defin... 阅读详情


◉ 顺序栈与链栈

顺序栈 底层是一个数组
在使用前需要先设置好栈的大小,大小受限

链栈 底层是一个单链表
每一次增加结点都需要开辟新空间,理论上大小不受限


◉ 基本操作

  • 初始化栈 init
  • 判断空栈 isEmpty
  • 得到栈顶 getTop
  • 获取长度 length
  • 压栈入栈 push
  • 弹栈出栈 pop
  • 清空全栈 clear
  • 摧毁全栈 destroy

◉ 实现注意事项

  • C语言 中栈的数据类型可使用 void* 空指针,来支持多种类型的接收
  • Java 中则可以方便地使用 泛型 来控制数据类型
  • 顺序栈中应该设定一个栈顶指针 top ,初始值为-1,指向栈顶元素
  • 链栈中的单链表均应采用头插法,每次都要替换掉头指针,保证最后进去的数据在最前面

◉ C语言实现

—① 顺序栈

头文件 SqStack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

typedef enum Status
{
	ERROR = 0, SUCCESS = 1
} Status;

typedef int ElemType;

typedef struct SqStack
{
	ElemType* elem;
	int top;
	int size;
} SqStack;


//基于数组的顺序栈
Status initStack(SqStack* s, int sizes);//初始化栈
Status isEmptyStack(SqStack* s);//判断栈是否为空
Status getTopStack(SqStack* s, ElemType* e); //得到栈顶元素
Status clearStack(SqStack* s);//清空栈
Status destroyStack(SqStack* s);//销毁栈
Status stackLength(SqStack* s, int* length);//检测栈长度
Status pushStack(SqStack* s, ElemType data);//入栈
Status popStack(SqStack* s, ElemType* data);//出栈


#endif 

实现文件 SqStack.c

#include "SqStack.h"
#include <malloc.h>

// 初始化栈
Status initStack(SqStack* s, int sizes)
{
	// 栈已经开辟好了,不需要再开辟
	if (s->elem != NULL) return ERROR;

	// 为栈开辟空间
	s->elem = (int*)malloc(sizeof(int) * sizes);

	// 空间开辟成功时,设置栈顶和栈的大小
	if (s->elem != NULL)
	{
		s->top = -1;
		s->size = sizes;
		return SUCCESS;
	}
	else return ERROR;
}

// 判断栈是否为空
Status isEmptyStack(SqStack* s)
{
	// 未初始化或已初始化但没有元素,均视为空
	if (s->elem == NULL || s->top == -1) return SUCCESS;
	else return ERROR;
}

// 得到栈顶元素
Status getTopStack(SqStack* s, ElemType* e)
{
	// 在栈不为空时获取
	if (!isEmptyStack(s))
	{
		*e = s->elem[s->top];
		return SUCCESS;
	}
	else return ERROR;
}

// 清空栈
Status clearStack(SqStack* s)
{
	// 栈不为空时进行
	if (!isEmptyStack(s))
	{
		// 不断弹出元素
		while (s->top > -1) s->elem[s->top--] = NULL;
		return SUCCESS;
	}
	else return ERROR;
}

// 销毁栈
Status destroyStack(SqStack* s)
{
	// 栈已经初始化时进行
	if (s->elem != NULL)
	{
		free(s->elem);	// 释放数组
		s->elem = NULL;	// 指向空

		s->size = 0;	// 长度归零
		s->top = 0;		// 栈顶归零
		return SUCCESS;
	}
	else return ERROR;
}

// 检测栈长度
Status stackLength(SqStack* s, int* length)
{
	// 栈是否已经初始化
	if (s->elem != NULL)
	{
		*length = s->top + 1;  // 栈当前的长度
		return SUCCESS;
	}
	else return ERROR;
}

// 入栈
Status pushStack(SqStack* s, ElemType data)
{
	// 栈已经初始化并且还没有满
	if (s->elem != NULL && s->top < s->size - 1)
	{
		s->elem[++s->top] = data;  // 推入元素并改变栈顶
		return SUCCESS;
	}
	else return ERROR;
}

// 出栈并返回被弹出的元素
Status popStack(SqStack* s, ElemType* data)
{
	// 栈不为空时进行
	if (!isEmptyStack(s))
	{
		*data = s->elem[s->top];  // 返回弹出的元素
		s->elem[s->top--] = NULL;  // 弹出元素并改变栈顶
		return SUCCESS;
	}
	else return ERROR;
}

—② 链栈

头文件 LinkStack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

typedef enum Status
{
	ERROR = 0,
	SUCCESS = 1
} Status;

typedef int ElemType;

typedef  struct StackNode
{
	ElemType data;
	struct StackNode* next;
}StackNode, * LinkStackPtr;

typedef  struct  LinkStack
{
	LinkStackPtr top;
	int	count;
}LinkStack;



//链栈
Status initLStack(LinkStack* s);//初始化栈
Status isEmptyLStack(LinkStack* s);//判断栈是否为空
Status getTopLStack(LinkStack* s, ElemType* e);//得到栈顶元素
Status clearLStack(LinkStack* s);//清空栈
Status destroyLStack(LinkStack* s);//销毁栈
Status LStackLength(LinkStack* s, int* length);//检测栈长度
Status pushLStack(LinkStack* s, ElemType data);//入栈
Status popLStack(LinkStack* s, ElemType* data);//出栈


#endif 

实现文件 LinkStack.c

#include "LinkStack.h"
#include <malloc.h>

//初始化栈
Status initLStack(LinkStack* s)
{
	// 栈已经开辟好了,不需要再开辟
	if (s->top != NULL) return ERROR;

	// 为栈开辟空间
	s->top = (LinkStackPtr*)malloc(sizeof(LinkStack));

	// 空间开辟成功时,设置栈的长度
	if (s->top != NULL)
	{
		s->top->next = NULL;
		s->count = 0;
		return SUCCESS;
	}
	else return ERROR;
}

// 判断栈是否为空
Status isEmptyLStack(LinkStack* s)
{
	// 未初始化或已初始化但没有元素,均视为空
	if (s->top == NULL || s->count == 0) return SUCCESS;
	else return ERROR;
}

// 得到栈顶元素
Status getTopLStack(LinkStack* s, ElemType* e)
{
	// 在栈不为空时获取
	if (!isEmptyLStack(s))
	{
		*e = s->top->data;
		return SUCCESS;
	}
	else return ERROR;
}

// 清空栈
Status clearLStack(LinkStack* s)
{
	// 栈不为空时进行
	if (!isEmptyLStack(s))
	{
		LinkStackPtr temp;  // 用于删除的临时指针

		// 不断弹出元素
		while (s->count > 0)
		{
			temp = s->top->next;	// 存放下一个元素
			free(s->top);			// 释放栈顶元素
			s->top = temp;			// 改变栈顶
			s->count--;				// 栈长度 -1
		}
		return SUCCESS;
	}
	else return ERROR;
}

// 销毁栈
Status destroyLStack(LinkStack* s)
{
	// 栈已经初始化时进行
	if (s->top != NULL)
	{
		clearLStack(s);	// 先将栈清空
		free(s->top);	// 再将栈顶指针释放掉
		s->top = NULL;	// 指向空
		return SUCCESS;
	}
	else return ERROR;
}

// 检测栈长度
Status LStackLength(LinkStack* s, int* length)
{
	// 栈已经初始化时进行
	if (s->top != NULL)
	{
		*length = s->count;  // 栈当前的长度
		return SUCCESS;
	}
	else return ERROR;
}

// 入栈
Status pushLStack(LinkStack* s, ElemType data)
{
	// 栈已经初始化时进行
	if (s->top != NULL)
	{
		// 开辟新结点
		StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));

		// 开辟成功时,入栈
		if (newNode != NULL)
		{
			newNode->data = data;	// 新结点赋值
			newNode->next = s->top;	// 新结点直线前一个结点
			s->top = newNode;		// 栈顶指针指向新结点
			s->count++;				// 栈长度 +1
		}
		else return ERROR;
	}
	else return ERROR;
}

// 出栈
Status popLStack(LinkStack* s, ElemType* data)
{
	// 栈不为空时进行
	if (!isEmptyLStack(s))
	{
		LinkStackPtr temp = s->top->next;  // 用于删除的临时指针

		*data = s->top->data;  // 取出数据
		free(s->top);	// 释放栈顶结点
		s->top = temp;	// 新的栈顶结点
		s->count--;		// 栈长度 -1
		return SUCCESS;
	}
	else return ERROR;
}

◉ Java实现

—① 顺序栈

实现类 SqStack.java

package SqStack;

/**
 * @author : Ice'Clean
 * @date : 2021-04-04
 *
 * 实现顺序栈
 */
public class SqStack<T>{
    /**
     * 存放数据的数组
     * 由于不能直接用泛型做为数组
     * 这里采用了 Object 作为代替
     * 在读取数据时再将数据进行转化
     */
    private Object[] elem;

    /**
     * 存放栈顶坐标
     * 一开始坐标指向 -1 表示栈为空
     */
    private int top = -1;

    /**
     * 存放栈的大小
     * 默认设置为 10
     */
    private int size = 10;

    /**
     * 初始化栈并使用默认容量
     */
    public SqStack(){
        elem = new Object[this.size];
    }

    /**
     * 初始化栈并指定栈的大小
     * @param size 栈的最大容量
     */
    public SqStack(int size){
        this.size = size;
        elem = new Object[size];
    }

    /**
     * 入栈
     * @param data 要进栈的数据
     * @return 成功返回 true,否则 false
     */
    public boolean pushStack(T data){
        if(top < size - 1) {
            elem[++top] = data;
            return true;
        }

        return false;
    }

    /**
     * 出栈
     * @return 成功返回 true,否则 false
     */
    public boolean popStack(){
        if(top > -1){
            elem[top--] = null;
            return true;
        }

        return false;
    }

    /**
     * 判断栈是否为空
     * @return 成功返回 true,否则 false
     */
    public boolean isEmptyStack(){
        return top == -1;
    }

    /**
     * 得到栈顶元素
     * @return 栈顶元素的数值
     */
    public T getTopStack(){
        return (T)elem[top];
    }

    /**
     * 返回栈的长度
     * @return 栈当前的长度
     */
    public int length(){
        return this.top + 1;
    }

    /**
     * 清空栈
     * @return 成功返回 true,否则 false
     */
    public boolean clearStack(){
        while(top > -1)
        {
            elem[top--] = null;
        }

        return true;
    }

    /**
     * 输出栈的内容
     * @return 字符串形式的栈内容
     */
    @Override
    public String toString() {
        StringBuilder content = new StringBuilder();
        for(Object con : elem){
            if(con == null){
                break;
            }

            content.append(con);
            content.append(" / ");
        }

        return "顺序栈 :" + content;
    }
}

—② 链栈

结点类 StackNode.java

package LinkStack;

import java.util.Stack;

/**
 * @author : Ice'Clean
 * @date : 2021-04-04
 *
 * 链栈的结点
 */
public class StackNode<T> {

    private T data;
    private StackNode<T> next;

    /**
     * 创建空结点
     */
    public StackNode()
    {

    }

    /**
     * 创建带数据和指向的结点
     * @param data 结点的数据
     * @param next 结点的指向
     */
    public StackNode(T data, StackNode<T> next)
    {
        this.data = data;
        this.next = next;
    }

    /**
     * 使链表指向新的结点
     * @param next 下一个结点
     */
    public void setNext(StackNode<T> next)
    {
        this.next = next;
    }

    /**
     * 修改该结点的数据
     * @param data 该结点的新数据
     */
    public void setData(T data)
    {
        this.data = data;
    }

    /**
     * 获取下一个结点
     * @return 下一个结点
     */
    public StackNode<T> getNext() {
        return next;
    }

    /**
     * 获取该节点的数据
     * @return 该节点的数据
     */
    public T getData() {
        return data;
    }
}

实现类 LinkStack.java

package LinkStack;

/**
 * @author : Ice'Clean
 * @date : 2021-04-04
 *
 * 链栈实现
 */
public class LinkStack<T> {

    /**
     * 链栈的头结点
     */
    private StackNode<T> top;

    /**
     * 链栈的长度
     */
    private int count;

    /**
     * 初始化空链栈
     */
    public LinkStack(){

    }

    /**
     * 初始化链栈并压入一个数据
     */
    public LinkStack(T data){
        top = new StackNode<T>(data, null);
        count++;
    }

    /**
     * 入栈
     * @param data 入栈的数据
     * @return 是否成功
     */
    public boolean push(T data){

        if(top == null){
            top = new StackNode<T>(data, null);
        }
        else{
            // 新建一个结点指向 head,然后赋值给 head,保证 head 在栈顶
            top = new StackNode<T>(data, top);
        }

        // 长度自增 1
        count++;

        return true;
    }

    /**
     * 出栈
     * @return 成功返回 true, 否则 false
     */
    public boolean pop(){

        if(count > 0){
            StackNode<T> temp = top;
            top = top.getNext();
            temp = null;
            count--;

            return true;
        }

        return false;
    }

    /**
     * 判断栈是否为空
     * @return 是则返回 true,否则 false
     */
    public boolean isEmpty(){
        return count == 0;
    }

    /**
     * 得到栈顶元素
     * @return 栈顶元素的值
     */
    public T getTop(){
        if(count > 0){
            return top.getData();
        }

        return null;
    }

    /**
     * 清空栈
     * @return 成功放回 true, 否则 false
     */
    public boolean clear(){
        while(count > 0){
            pop();
        }

        return true;
    }

    /**
     * 返回栈当前的长度
     * @return 栈的长度
     */
    public int length(){
        return this.count;
    }

    /**
     * 输出栈的内容
     * @return 字符串形式的栈内容
     */
    @Override
    public String toString() {
        StringBuilder content = new StringBuilder();
        StackNode<T> temp = top;

        while(temp != null){
            content.append(temp.getData());
            content.append(" -> ");
            temp = temp.getNext();
        }

        content.append("null");

        return "链栈:" + content;

    }
}


测试类就没放了
时刻欢迎指正!

耕耘收获(IceClean)

用blender为模型贴图并在gazebo中显示 用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型 阅读详情

相关推荐

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

Java实现栈

顺序栈使用一组地址连续的内存单元来存储栈中的元素,同时设置一个栈顶变量top,用来标识栈顶元素。链栈是用一组任意的存储单元来存储栈中的元素,链栈中的指针从栈顶指向栈底,同时设置一个栈顶变量指向栈中的第一个元素(栈顶元素)。定义一个LinkedStack类,每一个LinkedStack对象,就代表一个链栈,并在该类中定义关于栈的基本操作方法。定义一个ArrayStack类,每一个ArrayStack对象就代表一个栈,并在该类中定义关于顺序栈的基本操作方法。栈的实现方式有两种,分别顺序栈和链栈。

m0_52884709的博客 1903

ComfyUI Impact Pack实战:如何用三大检测器打造高效人脸修复工作流(附2025最新模板)

本文详细解析了如何利用ComfyUI Impact Pack中的BBOX、Segm和SAM三大检测器构建高效人脸修复工作流。通过技术选型、参数优化和实战案例,帮助用户掌握从精准定位到细节修复的全流程技巧,特别适用于商业摄影和影视制作场景。文章还提供了2025年最新模板和性能优化方案,显著提升人脸精修效率。

weixin_29040367的博客 245

【数据结构】堆栈(顺序栈、链栈)的JAVA代码实现

堆栈(stack)是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入和删除操作的一端称为栈顶,最下面的那一端称为栈底。栈顶是动态的,它由一个称为栈顶指针的位置指示器指示。当栈中没有数据元素时,为空栈。堆栈的插入操作称为进栈或入栈,堆栈的删除操作称为出栈或退栈。 栈的主要特点是“后进先出”,即后进栈的元素先被处理。因此,栈又被称为后进先出(last in fir...

Yngz_Miao的博客 1万+

深度强化学习调参技巧:以DQN、DDPG、TD3、PPO、SAC等算法为例

深度强化学习调参技巧:以D3QN、DDPG、TD3、PPO、SAC算法为例

丨汀、的博客 3444

SAP Cloud ERP 是什么,一篇文章讲清楚

SAP Cloud ERP并非简单将传统ERP搬到云上,而是对企业核心流程、数据和管理方式的全面重构。它包含S/4HANA Cloud的公有云版(标准化、快速部署)和私有云版(灵活定制),分别对应GROW with SAP和RISE with SAP实施路径。核心价值在于实现实时数据整合、端到端流程贯通及持续演进能力。企业需根据发展阶段选择:新兴企业适合标准化公有云,复杂组织可考虑私有云迁移。关键在于转变管理思维,避免将旧系统问题复制到新平台。上云决策本质是企业对数字化基座的选择,需权衡标准化与个性化需求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 108

Java栈的实现(顺序栈、链式栈)及栈的应用

1. 顺序栈的实现 package lang; import java.io.Serializable; import java.util.Arrays; /** * @ClassName: ArrayStack * @Description: 顺序栈 * @date 2014年1月20日 上午8:47:19 * @param */ public clas

jiutianhe的专栏 1万+

【异常】OpenClaw 连接异常This site can‘t be reached 127.0.0.1 refused to connect Try: Checking the proxy

在访问OpenClaw相关服务时,浏览器提示如下异常信息,无法正常加载页面:Try:补充说明:该报错仅出现于本地访问场景(127.0.0.1为本地回环地址),涉及OpenClaw核心服务的本地连接交互,无外部网络及敏感信息泄露风险。

奶爸的编程之路,也就一周冷个三天 1484

数据结构-栈的Java实现(顺序结构与链结构)

目录: 顺序表的Java实现 链表的Java实现 1.栈的特点 栈(stack)是限定仅仅在表尾进行插入或删除的线性表。表尾称为栈顶(top),表头端称为栈底(base)。 栈就是对日常生活中“先进后出”这一现象的抽象,能够帮助我们将许多实际问题抽象成数据结构来解决问题,比如铁路调度,递归调用的实现。 2.栈的抽象数据类型(ADT) 将栈的操作抽象为一个接口,规范后续的顺序栈与链栈,包括栈空...

qq_42200733的博客 584

【深度学习】什么是自回归模型?

自回归模型是一种重要的时间序列模型,通过利用过去的值来预测当前或未来的值。它在统计学、经济学、自然语言处理等领域有广泛的应用。自回归模型的简单性和可解释性使其成为许多应用的首选,但在更复杂的情况下,可能需要结合其他模型如移动平均模型(MA模型)或混合模型(如ARIMA)来更好地捕捉时间序列中的模式。扩散模型(Diffusion Model)和自回归模型(Autoregressive Model)是两种不同的生成模型,各自有独特的特点和应用场景。

q742971636的博客 1671

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2250

顺序栈以及链式栈的浅析

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操 作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任 何元素的栈称为空栈,栈又称为后进先出的线性表 链式栈与顺序栈相比有很多优点。当栈需要动态变化时,如果使用顺序栈,如果设置过大会造成很多的资源浪费;如果过小,当栈溢出时,需要开辟一块更大的空间同时将原来栈中的元素全部拷贝过去,造成较大的时间开销。相反,用链接表示可以动态...

Sherlock_Provence的博客 2059

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java代码实现顺序栈和链式栈

Java代码实现顺序栈和链式栈 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入或者删除运算。后进先出(Last In First Out)。 栈中的数据操作主要有push(压入)和pop(弹出)操作。 实际上,栈就可以用数组来实现,也可以用链表来实现。用数组实现的叫做顺序栈,用链表实现的叫做链式栈。 为了简单起见,我们的栈不支持泛型。 顺序栈 public c...

tinyVampire的博客 2724

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java实现链栈,顺序栈

那么,栈其实是链表的特殊形式,我们引进了一种叫做top的指针来表示栈的栈顶,栈顶指针top实际只能指向栈的最后一个数据,并且遵循先进后出的规则,由栈顶指针统筹,永远指向栈顶。 添加数据(入栈)只能在栈顶加入 删除数据(出栈)只能从栈顶删除 其他数据即栈头,栈内的数据不允许直接入栈和出栈 链栈: public class linkStrack{ private Node top; private int length; public linkStrack()

m0_56315670的博客 516

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

顺序栈和链栈结构及实现

一、目的 领会顺序栈存储结构和掌握顺序栈中各种基本运算算法设计; 领会链栈存储结构和掌握链栈中各种基本运算算法设计。 二、内容 编写一个程序sqstack.cpp,实现顺序栈(假设栈中元素类型ElemType为char)的各种基本运算,并在此基础上设计一个程序exp3-1.cpp,完成如下功能: (1) 初始化栈s (2) 判断栈s是否非空 (3) 依次进栈元素a、b、c、d、e (4) 判...

ID:1024 6048

数据结构Java实现05----栈:顺序栈和链式堆栈

  一、堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。 备注:栈本身就是一个线性表,所以我...

weixin_34327223的博客 286

顺序栈和链式栈的代码实现

栈的基本概念,一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则

Charming的博客 452

数据结构——栈(Java代码实现)

栈栈基本概念栈的顺序存储栈的链式存储 栈基本概念 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。栈的操作原则为"后进先出"(LIFO) 往栈中添加元素的操作,一般叫做 push,入栈。 从栈中移除元素的操作,一般叫做 pop,出栈(只能移除栈顶元素,也叫做:弹出栈顶元素) 栈的内部实现可以用以前学过的动态数组和链表实现。其实有了前面的学习,栈的实现很简单。首先我们先设计一个Stack接口,里面写一些

mazouri的博客 774

实现顺序栈的初始化、出栈、入栈,取栈顶、遍历栈操作

实现顺序栈的初始化、出栈、入栈,取栈顶、遍历栈操作 #include<iostream> #define ok 1 #define error 0 #define MAXSIZE 100 using namespace std; struct SqStack{ int *base; int *top; int stacksize; }; //初始化顺序栈 int InitStack(SqStack &s){ s.base = new int[MAXSIZE]; //分配内

weixin_44865810的博客 6024

栈之顺序栈(包含完整代码)C语言版

看一下关于栈的思维导图 栈是只允许在一端进行插入或删除操作的线性表,按照物理结构的不同,栈又分为顺序栈和链栈。 本篇文章是顺序栈的专场。 来看实现各个功能的代码块 //顺序栈的定义 #define MaxSize 10 //定义栈中最大元素的个数 typedef struct{ elemtype data[MaxSize]; //静态数组存放栈中元素,销毁栈时不必手动释放空间 int top; //定义栈顶指针 }SqStack; //初始化栈 void InitStack(SqStack &

weixin_44918193的博客 1万+

顺序栈的C语言实现——初始化函数、入栈函数和出栈函数

将顺序栈的结构定义为: #define  M  100   //栈的空间 typedef struct   {   int data[M]; int top;   } SqStack; 试写出SqStack的初始化函数、入栈函数和出栈函数 。并在main()函数中测试上述函数。 #include #include #define M 100 #define OK 1 #defi

mnuamua的博客 1万+

【数据结构】栈的链式实现和操作(创建栈,入栈,出栈,获取栈顶元素)

栈是一种重要的数据结构,符合“后进先出”(FILO)的原则。就像向箱子里堆东西一样,后放入的元素需要被先取出来。这篇文章,我将介绍链式栈的创建和基本操作。 ①链式栈的实现需要两个结构体:Stack和Node。 (1)Node结构体即为链表的结点,存放data和next指针。Node结构体用来存放数据并组成栈,入栈和出栈都需要借助Node结构体。 (2)Stack结构体即为“栈”的实体,存放栈容量size和top指针。由于这个栈已经借助Node创建好了,我们只需要通过top指针就可以操作栈了。所以top指针

GalaxyerKw的博客 1万+

初始化栈的代码_数据结构栈(3)顺序栈的扩展:两栈共享空间

顺序栈代码更清晰,只允许栈顶进出元素,改变相应数组下标值即可,使用非常方便。但缺点很明显,只要使用数组,必须事先声明数组存储大小,需要多大的空间要心里有数,所以可能会空间不够用。解决办法:1、使用链式栈;2、如果需要两个相同类型的栈,可以公用空间。如下图:刚开始,top1为-1,top2为size,表示栈1栈2都为空。栈满的时候,栈顶指针挨着,即top1+1==top2;代码#inclu...

weixin_39770311的博客 159

数据结构——栈(顺序栈,链栈)的基本代码

数据结构——栈(顺序栈,链栈) 1.采用顺序存储实现栈的初始化、判栈为空、入栈、求栈顶元素、出栈实现、将任意一个十进制整数转化为R进制整数操作。 2.采用链式存储实现栈的初始化、判栈为空、入栈、求栈顶元素、出栈操作。 #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; using nam...

Wangzx的博客 1766

数据结构_栈_顺序栈与链栈(Java实现)

*文中内容来源于《数据结构 --Java语言描述》(第二版) 刘小晶 杜选 主编 *此系列文章作为学习记录,若文中内容有误,请大家指出,谢谢 栈(Stack) 栈的概念 栈是一种特殊的线性表,栈中的数据元素以及数据元素间逻辑关系和线性表相同,两者差别在于:线性表的插入和删除操作可以在表的任何位置进行,而栈的插入和删除操作只允许在表的尾段进行。其中,栈中允许进行插入和删除操作的一段称为栈顶(top)...

Fam044的博客 508
上一篇: 【C实战经验】C语言基础算法归纳总结(持续补全)
下一篇: 【Java.bug】(1)Can‘t find bundle for base name xxx, locale zh_CN
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒冰小澈IceClean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值