线性表--多栈共享技术(十)
时间:2022-07-28
本文章向大家介绍线性表--多栈共享技术(十),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.介绍
栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况。若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出、有的栈空间还很空闲的情况。为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术。在顺序栈的共享技术中,最常用的是两个栈的共享技术,名双端栈。
1.图示
栈1和栈2添加元素时,都会向数据中间靠拢,当栈1的指针+1等于栈2的指针的时候,栈满。
2.代码实现
(1) 定义双端栈
#define M 100
typedef struct
{
int elem[M];
char top[2]; //top[0]和top[1]分别作为两个栈顶的指示器
}DqStack;
(2) 初始化
void InitStck(DqStack * S)
{
S->top[0] = -1;
S->top[1] = M;
}
(3) 进栈
int Push(DqStack * S, int x,int i)
{
if (S->top[0] + 1 == S->top[1])return(false);
switch (i)
{
case 0:
S->top[0]++;
S->elem[S->top[0]] = x;
break;
case 1:
S->top[1]++;
S->elem[S->top[1]] = x;
break;
default:
return (false);
}
return(true);
}
(4) 出栈
int Pop(DqStack * S, int *x,int i)
{
switch (i)
{
case 0:
if (S->top[0] == -1)return(false);
*x = S->elem[S->top[0]];
S->top[0]--;
break;
case 1:
if (S->top[1] == M)return(false);
*x = S->elem[S->top[1]];
S->top[1]--;
break;
default:
return (false);
}
return (true);
}
若有错误,欢迎指正批评,欢迎讨论。 每文一句:做事有两种境界。一种是功利的境界,事情及相关的利益是唯一的目的,于是做事时必须会充满焦虑和算计。另一种是道德的境界,无论做什么事,都把精神上的收获看得更重要,做事只是灵魂修炼和完善的手段,真正的目的是做人。正因为如此,做事时反而有了一种从容的心态和博大的气象。做事即做人。
- HDU 1013 Digital Roots【字符串,水】
- Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
- Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
- Gym 100952G&&2015 HIAST Collegiate Programming Contest G. The jar of divisors【简单博弈】
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+
- Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】
- Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
- 51 Nod 1008 N的阶乘 mod P【Java大数乱搞】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战06】给Agent添加记忆功能
- Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】
- [开源,学习,分享]UWP第三方简书客户端分享
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- uniapp获取接口数据,渲染在picker选择器里面
- 我们是这样一步一步实现分布式锁的
- 缓存并发神技,如何通过双 key 来解决缓存并发问题?
- LRU缓存淘汰算法实现方案,这次没人再说你不会开发
- JVM技术总结之三——类加载机制
- 为什么你每次被问到HashMap底层原理都一知半解,搞定它
- 要想精通java,你必须得知道java的内存模型,不忽悠
- java类加载机制,再也不怕面试官的刁难
- 前端科普系列(4):Babel —— 把 ES6 送上天的通天塔
- JVM技术总结之五——JVM逃逸分析
- React源码解读【二】更新创建
- JVM技术总结之六——JVM的锁优化
- 每日两题 T12
- 删除列中的 NULL 值
- Linux生产环境CPU使用率100%,教你定位到具体函数