初始化栈的代码_数据结构栈(3)顺序栈的扩展:两栈共享空间

顺序栈代码更清晰,只允许栈顶进出元素,改变相应数组下标值即可,使用非常方便。但缺点很明显,只要使用数组,必须事先声明数组存储大小,需要多大的空间要心里有数,所以可能会空间不够用。 解决办法:1、使用链式栈;2、如果需要两个相同类型的栈,可以公用空间

如下图:

31ec83e18f8c1dfde4b5d23b25b5327a.png

刚开始,top1为-1,top2为size,表示栈1栈2都为空。栈满的时候,栈顶指针挨着,即top1+1==top2;


代码

#include #include #define StackElem char#define SIZE 20typedef struct Stack{  StackElem * elem;  int top1;  //栈1的栈顶指针  int top2;  //栈2的栈顶指针  int Size_Stack;  //栈的最大长度}Stack,*StackPtr;void Stack_Init(StackPtr s);  //初始化bool Stack_Push(StackPtr s,StackElem val,int StackNumber );  //val入栈,StackNumber表示哪个栈bool Stack_Pop(StackPtr s,int StackNumber);  //出栈valvoid Stack_Traverse(StackPtr s,int StackNumber);  //遍历int main(void){  Stack s;  Stack_Init(&s);  //push栈1  Stack_Push(&s, 1, 1);  Stack_Push(&s, 2, 1);  Stack_Push(&s, 3, 1);  //push栈2  Stack_Push(&s, 7, 2);  Stack_Push(&s, 8, 2);  Stack_Push(&s, 9, 2);  Stack_Traverse(&s, 1);  printf("\n");  Stack_Traverse(&s, 2);  return 0;}void Stack_Init(StackPtr s){  s->elem = (StackElem*)malloc(sizeof(Stack) * SIZE);  if (NULL == s->elem)  {    printf("内存分配失败,程序结束!");    exit(-1);  }  s->top1 = -1;  s->top2 = SIZE;  s->Size_Stack = SIZE;}bool Stack_Push(StackPtr s,StackElem val, int StackNumber)  {//val入栈,StackNumber表示哪个栈  if (s->top1 + 1 != s->top2)  //说明栈没满  {    if (StackNumber == 1)    {      s->top1++;      s->elem[s->top1] = val;    }    else if (StackNumber == 2)    {      s->top2--;      s->elem[s->top2] = val;    }    return true;  }  else  {    printf("栈已满,入栈失败!");    return false;  }}bool Stack_Pop(StackPtr s,StackElem *val, int StackNumber)  {  if (StackNumber == 1)  //栈1  {    if (s->top1 != -1)  //栈1不为空    {      *val = s->elem[s->top1];  //存放出栈元素的值      s->top1--;      return true;    }    else  //栈1为空    {      printf("栈1为空,出栈失败!");      return false;    }  }  else if (StackNumber == 2)  {    if (s->top2 != SIZE)  //栈2不为空    {      *val = s->elem[s->top2];      s->top2++;      return true;    }    else  //栈2为空    {      printf("栈2为空,出栈失败!");      return false;    }  }}void Stack_Traverse(StackPtr s, int StackNumber){  int i;  if (StackNumber == 1)  {    for (i = s->top1; i > -1; i--)      printf("%d ", s->elem[i]);  }  else if (StackNumber == 2)  {    for (i = s->top2; i < SIZE; i++)      printf("%d ", s->elem[i]);  }}

运行结果

84b6de041489ce46ebdf07a81ba88958.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值