首页 > 其他分享 >3.4 顺序栈的表示和实现

3.4 顺序栈的表示和实现

时间:2023-03-18 21:11:06浏览次数:44  
标签:顺序 return 实现 top 栈顶 算法 3.4 base

  • 由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式
    • 栈的顺序存储——顺序栈
    • 栈的链式存储——链栈

顺序栈的表示和实现


存储方式:同一般线性表的顺序存储结构完全相同,
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低端地址。

  • 附设top指针,指示栈顶元素在顺序栈中的位置。
  • 另设base指针,指示栈底元素在顺序栈中的位置。
    但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址。
  • 另外,用stackSize表示栈可使用的最大容量
  • 例如:如下图所示
    image

空栈:base==top 是栈空的标志
栈满时的处理方法:
1、报错返回
2、分配更大的空间,作为栈的存储空间, 将原栈的内容移入新栈。

使用数组作为顺序栈存储方式的特点:
简单、方便、但易产生溢出(数组大小固定)

  • 上溢(overflow):栈已经满,又要压入元素
  • 下溢(underflow):栈已经空,还要弹出元素。

注意:上溢是一种错误, 是问题的处理无法进行;而下溢一般认为是一种结束条件,即问题处理结束。

顺序栈的表示


#define  MaxSize 100
typedef struct {
  SElemType  *base;  // 栈底指针
  SElemType  *top;   // 栈顶指针
  int stackSize;     // 栈的最大容量
}SqStack;

顺序栈初始化

  • 【算法描述】

    Status InitStack(SqStack &S){   // 构造空栈
      	S.base=new SElemType[MaxSize]
        // S.base=(SElemType*)malloc(sizeof(SElemType));
        if(!S.base)  exit (OVERFLOW);  // 存储分配失败
      	s.stackSize=MaxSize;
      	s.top=s.base;
      	return OK;
    }
    

判断顺序栈是否为空

  • 【算法思想】栈为空的标志是:S.base=S.top,即栈顶与栈底指针相等

  • 【算法描述】

    Status IsEmpty(SqStack S){
      // 若栈为空,返回TURE;否则返回FALSE
      if(S.base==S.top){
        return TRUE;
      }else{
        return FALSE;
      }
    }
    

顺序栈的清空

  • 【算法思想】与栈空的标志息息相关,也就是强制使S.base=S.top,而不管里面存储内容,因为最后都可以进行内容覆盖就好。

  • 【算法描述】

    Status ClearStack(SqStack &S){
       //1、 先判断栈是否存在
      if(!S.base){
        	return ERROR;
      }
      //2、使base=top
      S.base=S.top;
      return OK;
    }
    

顺序栈的销毁

  • 【算法思想】销毁是将分配的内存空间进行释放掉,将栈的长度置为零,将两个指针置为空。

  • 【算法描述】

      Status Del_Status(SqStack &S){
        	if(!S.base){
            return ERROR;
          }
           
        	delete S.base;
        	*S.stacksize=0;
        	S.base=S.top=null;
        	
        	return OK;
      }
    

顺序栈的入栈

  • 【算法思想】 将添加栈的元素放置在栈顶中,并且将top指针上移一位。

  • 【算法步骤】
    1、判断是否栈满,若满则出错(上溢)
    2、元素e压入栈顶
    3、栈顶指针加1

  • 【算法描述】

    Status Push(SqStack &S,SElemType e){
        if(S.top-S.base==S.stacksize){
          	return ERROR;
        }
      
      	*S.top=e;
      	S.top++;
      	return OK;
    }
    

顺序栈的出栈

  • 【算法思想】将栈顶元素进行出栈操作

  • 【算法步骤】
    1、判断栈是否为空,若为空则出错(下溢)
    2、栈顶元素减一
    3、将元素e返回将该位置的置为空。

  • 【算法描述】

    Status Pop(SqStack &S,SElemType &e){
      	if(S.top==S.base)
          		return ERROR;
      	--S.top;
      	e=*S.top;
      	return OK;
    }
    

标签:顺序,return,实现,top,栈顶,算法,3.4,base
From: https://www.cnblogs.com/wangjunxiang/p/17231763.html

相关文章

  • RHEL 7配置HAProxy实现Web负载均衡
    本文将简单介绍使用HAProxy实现web负载均衡,主要内容包括基于权重的轮询、为HAProxy配置https、配置http重定向为https、配置HAProxy使用独立日志。一、测试环境HAProxy:......
  • Vue实现图片点击隐藏效果
    前言:组件作为Vue.js最强大的功能之一,因其封装可复用的代码方便程序员调用和可根据需求对组件进行个性化开发而深受广大前端程序员的喜爱。组件化的开发大大提升了代码的复......
  • react方式实现rate组件
    看到网上写的rate组件,要么是react的class方式,要么就是基于classNameList的增删改查,总感觉不太完美,于是趁周末自己撸了一个,可以直接拿到自己的页面去试,喜欢请点个赞哦需求......
  • webpack原理(1):Webpack热更新实现原理代码分析
    热更新,主要就是把前端工程文件变更,即时编译,然后通知到浏览器端,刷新代码。服务单与客户端通信方式有:ajax轮询,EventSource、websockt。客户端刷新一般分为两种:整体页面刷新,......
  • React 实现 动态加载组件
    React实现动态加载组件import{Button}from'antd'importReact,{useState,lazy,Suspense}from'react'//这个地方动态加载组件constItem=lazy(()=>i......
  • webpack原理(1):Webpack热更新实现原理代码分析
    热更新,主要就是把前端工程文件变更,即时编译,然后通知到浏览器端,刷新代码。服务单与客户端通信方式有:ajax轮询,EventSource、websockt。客户端刷新一般分为两种:整体页......
  • 已知球面经纬度求方位角和反方位角(awk一行代码实现)
    已知球面经纬度求方位角和距离一个常见的错误假如你在广州,先朝东北走2000km,然后朝西南走2000km,你不会回到起点,而是到达深圳或者东莞。这是因为地球是一个球面,方位角和反......
  • 0x09_自制操作系统My-OS实现Timer
    一般机器都会有一个计时器的设备,在一定时间内不断发送中断信号,我们接收这个中断信号搞一个timer++这就是计时器了把class06改07 naskfunc.asm;naskfunc;TAB=4[F......
  • 【InheritableThreadLocal】InheritableThreadLocal的实现机制和原理
    1 前言上节我们看了下ThreadLocal的实现原理,这节我们来看下 InheritableThreadLocal是用来干什么的呢?我们首先看个简单的现象:那我们把 ThreadLocal 换成 Inh......
  • Ruoyi | 集成aj-captcha实现滑块验证码
    由于最近在集成这玩意儿的时候实在是报错报麻了,所以写一下笔记记录一下,如果有人跟我一样,集成这个东西的时候各种报错,可以往下翻一翻找一下有没有你遇到的情况。首先准备东......