小工具      在线工具  汉语词典  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);
}
. . .

相关推荐

额外说明

Java 中级 - 不应实例化实用程序类

工具类不应该被实例化 工具类是什么? 错误实现方式——作为抽象类 正确实现方法——私有化构造器 工具类是什么? 工具类指的是内部只有静态方法和静态域的类,其不应该被实例化,因为其内部的方法和域可通过类名直接调用 错误实现方式——作为抽象类 默认编译器会提

额外说明

JFlash烧毁未知ARM芯片

如何添加新芯片,参考的资料为UM08001_JLink.pdf中的第12章——Open Flashloader。 12.1简介 随着可用设备的数量稳步增长,有时还处于早期阶段在MCU开发阶段,只有少数样品/电路板可用,可能不可用提供给第三方(如SEGGE

额外说明

Ajax接收循环数据,给操作button,的相应类添加function函数

1.先在js中定义函数, function classClick() { $('#content').html('点击事件'); } 2.在循环体中的button中加入点击事件,代码就不详细写了。 for循环。。 <div class="

额外说明

Python-streamlit-关于StreamLit的局限

【背景】 在外网环境下,Streamlit是一个非常棒的快速开发和应用数据分享互动类App的Python库。最大的特点,就是不需要开发前端。你只需要写Python,就可以同时拥有前端展示和后端逻辑。 【局限】 虽然很棒,但这些功能都依赖于链接的CDA,很

额外说明

web3学习博客目录大全

Web3是关于互联网发展的一个概念,主要与基于区块链的去中心化、加密货币、非同质化代币(NFT)和元宇宙有关。但Web3尚且是一个模糊的广义概念,具体什么是web3时代,待你我共同创造! 由于会陆续更新web3相关博客,为了更方便阅读,会在这里整理一下博

额外说明

Vue初体验——创建并运行一个Vue应用

文章目录 Vue是什么 JQuery是框架吗? 前端框架有哪些? Vue项目的创建步骤 演示环境的安装规划 1. 下载并安装Node.js 设置模块安装位置 2. 使用淘宝镜像 3. 安装Vue CLI (全局安装) 4. 创建项目 5. 运行项目 Vu

额外说明

几种语言遍历数组

数组是最简单的数据结构,遍历数组是常规操作。 下面给出VB、VFP、C、Java、Go与Python程序 实现数组遍历操作,大家可以做一个简单比较。 1、VB程序

额外说明

Vue ElementUI el-tree 添加单选按钮 el-radio 效果

背景 需要显示列表做单选效果; 效果 代码 代码第 6 行,使用 el-table 的单行点击事件 row-click; 代码第 7 - 13 行,设置单选按钮。注意 radio 的属性 lable 是整条记录,但要隐藏,详见隐藏代码 54 - 56 行

额外说明

使用修复软件快速解决api-ms-win-core-errorhandling-l1-1-0.dll系列问题

使用DLLEscort软件自动修复 DLLEscort软件能够修复解决常见的Windows系统文件与系统所需的大部分运行库,它可以帮助您一键修复系统软件或游戏丢失的DLL运行库文件,节省您的宝贵时间。 如果是因为缺少了运行库 导致的提示文件找不到错误 通

额外说明

解决Windows缺少vcomp100.dll问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个vcomp100.dll文件进行安装(前提是找到适合的版本),

ads via 小工具