• 注册
当前位置:1313e > 默认分类 >正文

两栈共享问题

这个应该是以一个数组实现两个栈的共享。
-----------------------------------------------
| | | | | | | | | | | 长度为10的数组

------------------------------------------------
top1(-1) top2(10)
如上图,假设初始top1为-1,top2为10,栈1push了一个数字2,栈2push了一个数字3之后,数组变成如下形式,top1为0,top2为9:

-----------------------------------------------
| 2 | | | | | | | | | 3 |

-----------------------------------------------
top1(0) top2(9)

当整个数组存满的时候top1+1=top2。比如栈1存了2、5、4、6、7,栈2存了3、9、4、8、1,此时top1=4,top2=5
----------------------------------------------------
| 2 | 5 | 4 | 6 | 7 | 1 | 8 | 4 | 9 | 3 |

typedef struct
{ElemType data[MAXSIZE];int top1;  //栈1栈顶指针int top2;  //栈2栈顶指针
}SqDoubleStack;
Status Push(SqDoubleStack *s , ElemType e , int stackNumber)
{if(s->top1+1 == s->top2)       //栈已满,不能再push新元素了return ERROR;if(stackNumber == 1)           //栈1有元素进栈s->data[++s->top1] = e;    //若栈1则先top+1后给数组元素赋值else if(stackNumber == 2)      //栈2有元素进栈s->data[--s->top2] = e;    //若栈2则先top2-1后给数组元素赋值return OK;}

因为在开始已经判断了是否有栈满的情况,所以后面的top1+1或top2-1是不担心溢出问题的。

      对于两栈共享空间的pop方法,参数就只是判断栈1栈2的参数stackNumber,代码如下:

 

//若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqDoubleStack *s , ElemType *e , int stackNumber)
{if(stackNumber == 1){if(s->top1 == 1)return ERROR;            //说明栈1已经是空栈,溢出*e = s->data[s->top1--];     //将栈1的栈顶元素出栈 
    }else if(stackNumber == 2){if(s->top2 == MAXSIZE)return ERROR;            //说明栈2已经是空栈,溢出*e = s->data[s->top2++];     //将栈2的栈顶元素出栈
    }return OK;
}

 

   事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长时另一个栈在缩短的情况。

      注意:这只是针对两个具有相同数据类型的栈。

 

转载于:https://www.cnblogs.com/13224ACMer/p/5036357.html

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录