小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

简介

栈和队列是两种重要的线性结构。从数据结构的角度来看,栈和队列也是线性表。它们的特殊性在于堆栈和队列的基本操作是线性表操作的子集。它们是操作有限的线性表。

堆栈是一个线性列表,它将插入或删除操作仅限于列表的末尾。因此,对于栈来说,表尾有特殊的意义,称为栈顶,相应的,表头也称为栈底。没有元素的空列表称为空堆栈。

在这里插入图片描述

顺序栈

顺序栈是指采用顺序存储结构实现的栈,即用一组地址连续的存储单元从栈底到栈顶依次存储数据元素,并有一个指针top附加指示堆栈顶部元素在顺序堆栈中的位置。

基本实现是:

在这里插入图片描述

在这里插入图片描述

  • 序列栈
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef struct{
    
	int *base;      //栈顶指针
	int *top;      //栈底指针
	int StackSize;
}SqStack;

//初始化
SqStack InitStack(){
    
	SqStack S;
	int a [MAXSIZE];
	S.base =  a;
	S.top = S.base;
	S.StackSize = MAXSIZE;
	return S;
}

//入栈
int Push(SqStack *S, int e){
    
	if(S->top-S->base ==S->StackSize) return 0;   //栈满
	S->top = e;
	(*S).top++;             //S->top ++
	return 1;
}

//出栈
int Pop(SqStack *S){
    
	if(S->base == S->top) return 0;    //栈空
	(*S).top--;              //S->top--
	int e;
	e= S->top;
	return e;
}

int main(){
    
	SqStack  S = InitStack();
	Push(&S,1);
	int e = Pop(&S);
	printf("%d\n",e);
	Push(&S,2);
	int e1 = Pop(&S);
	printf("%d\n",e1);
	Push(&S,3);
	int e3 = Pop(&S);
	printf("%d\n",e3);
	return 0;

}

代码上容易出错的地方是(*S).top++,在使用指针操作时,很多时候可能会写成S->top++。注意后者是指针取值,前者是指针运算,在每次入栈和出栈会进行指针运算,所以是前者。

链栈

链式堆栈是指采用链式存储结构实现的堆栈。链接栈是一个受限制的链表,只能从链表的头部开始操作。

链表中有前向插值法和后向插值法。前者以头节点为基础,在头节点之后插入新节点,每次插入都插入到链表的头部;后者使用尾指针作为光标,每次存储新的节点地址信息后,与新的等级点地址交换以存储下一个新的节点信息。

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

typedef struct StackNode{
    
	int data;
	struct StackNode *next;
}StackNode,LinkStack;

LinkStack* InitStack(){
    
	LinkStack* L = (LinkStack*)malloc(sizeof(LinkStack));
	L->next = NULL;
	return L;
}

//入栈-----栈的特点显示链栈只能使用前插法
int Push(LinkStack *L,int e){
    
	StackNode* node = (StackNode*)malloc(sizeof(StackNode));
	node->data = e;
	node->next = L->next;
	L->next = node;
	return 1;
}

//出栈 (后进先出)
int Pop(LinkStack* L){
    
	if(L->next ==NULL) return 0;
	int e;
	e= L->next->data;
	L->next=L->next->next;
	return e;
}


int main(){
    
	LinkStack* L = InitStack();
	Push(L,2);
	Push(L,3);
	int e = Pop(L);
	printf("%d",e);
	int e1 = Pop(L);
	printf("%d",e1);
	return 0;
}

栈与递归

堆栈的一个重要应用是在编程语言中实现递归。由于栈的后进先出特性,在处理某些具有连续特性的数据结构时,上一步的计算结构会影响下一步,因此可以采用程序的递归算法。

程序调用自身的编程技术称为递归。

构成递归所需的条件:

  1. 子问题必须与原问题相同,但更简单;

  2. 它不能无限制地调用自身,必须有出口,并且可以简化为非递归情况处理。

例如Σ r = 1 n \sum_{r=1}^nΣr=1n的求和中,循环是常用的求值方法,但是也是可以使用递归运算的。

int Fn(int x){
    
	if(x==1) return 1;
	else return Fn(x-1)+x;
}
#include<stdio.h>

int Fn(int x){
    
	if(x==1) return 1;
	else return Fn(x-1)+x;
}


int main(){
    
	int e = Fn(5);
	printf("%d",e);
}
. . .

相关推荐

额外说明

若易如何实现用户免密登录配置方式?

免密使用的场景,例如短信验证码,第三方应用登录等。 下面列出一个简单的实现方法,当然还有更多实现方式可以自己尝试。 目录 1、新建一个登录类型枚举类 2、自定义登录Token

额外说明

Kendo UI for jQuery---03.Component___Grid---04.数据绑定

数据绑定概述 默认情况下,jQuery 的 Kendo UI 网格会自动绑定到数据。 网格加载后,数据源会立即发送查询,并将数据加载到组件。要禁用此行为,请将组件的选项设置为 ,如下所示。autoBind false $("#grid").kendoGr

额外说明

如何使用django+uwsgi+nginx和ssl证书部署我们的后端项目

如何使用django+uwsgi+nginx以及ssl证书部署我们的后端项目(保姆级教程!) 一、前提条件: 有一台服务器,阿里云或者腾讯云等等 有一个自己的域名 服务器绑定了域名(这个很简单网上教程一堆,因为博主太穷不可能重整个服务器出教程所以就从这里

额外说明

【Python】【Selenium】如何给Input框输入带格式内容

【背景】 用selenium写自动化脚本过程中涉及向输入框自动传输内容。而且有时内容很多,如何保持段落分行呢? 【代码】 resource_desc = driver.find_element_by_xpath("//textarea[contains(

额外说明

Python 第九节 第三课

[toc] try...多个 except 结构     上面的结构可以捕获所有的异常, 工作中也很常见. 但是, 从金典理论考虑, 一般建议尽量捕获可能出现的多个异常 ( 按照先子类后父类的顺序 ) , 并且针对性的写出异常处理多代码, 为了避免遗漏可

额外说明

Java代码弱点与修复之——INT: Suspicious integer expression

弱点描述 “INT: Suspicious integer expression” ,可疑的整数表达式。该类型的漏洞指的是代码使用了不恰当的整数表达式。 该类型的弱点警告出现的场景比较多, 比如: 在条件语句中,使用了不恰当的整数比较操作符,例如在 if

额外说明

7. 延迟队列

延迟队列 7.1. 延迟队列概念 延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望 在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的 元素的队列。 7.2. 延迟队列使用场景

额外说明

Nginx 跨域

自用,简单粗暴。修改配置文件 conf/nginx.conf 在属性 http.server 下添加如下设置即可 #允许跨域请求的域,* 代表所有 add_header 'Access-Control-Allow-Origin' *; #允许带上cook

额外说明

ROS从入门到精通2-8:Gazebo仿真之快速生成二维地图真值

目录 0 专栏介绍 1 为什么需要地图真值? 2 Gazebo插件实现 2.1 单线扫描碰撞信息 2.2 写入.pgm地图文件 2.3 写入.yaml元文件 3 快速建图测试 4 机器人导航测试 0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS

额外说明

解决Windows系统找不到fltLib.dll文件导致功能异常问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个fltLib.dll文件(挑

ads via 小工具