线性表--多栈共享技术(十)

时间: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);
}

若有错误,欢迎指正批评,欢迎讨论。 每文一句:做事有两种境界。一种是功利的境界,事情及相关的利益是唯一的目的,于是做事时必须会充满焦虑和算计。另一种是道德的境界,无论做什么事,都把精神上的收获看得更重要,做事只是灵魂修炼和完善的手段,真正的目的是做人。正因为如此,做事时反而有了一种从容的心态和博大的气象。做事即做人。