栈应用之共用栈

为什么用共用栈:栈的顺序存储还是很方便的,但是当一个栈的容量空间不够了,我们就需要另开辟一段内存,这很麻烦。所以,我们干脆弄一个足够大的内存空间,然后让两个数据类型相同的栈来共享这个空间。
共用栈的实现原理:共享栈,即是两个栈使用同一段存储空间。第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间延伸。

参考博客:

http://www.cnblogs.com/xing901022/p/3534770.html
http://www.cnblogs.com/tinaluo/p/5255253.html

//栈的结构体
typedef struct Stack {
    int * data;   //元素
    int Maxsize;  //数组的最大容量
    int * top;    //栈2的栈顶指针
    int * bottom;  //栈1的栈顶指针
    int topLength;  //栈2的长度
    int bottomLength;  //栈1的长度
}Stack;

所有数据结构的功能都围绕四个字,增删查改。当然还包括初始化构造函数和销毁函数。所有的函数接口如下:

Stack * initStack(Stack * s, int maxsize);  //栈的初始化
Stack * clearStack(Stack * s);              //栈的销毁
void pushToStack(Stack * s, int elem);      //元素入栈
void popOutStack(Stack * s, int * elem);    //元素出栈
int searchByElem(Stack * s, int elem);      //通过元素搜索索引
int searchByIndex(Stack * s, int index);    //通过索引搜索元素
int getStackLength(Stack * s);              //得到栈长度
int isEmpty(Stack * s,int stack);           //判空
int isFull(Stack * s);                      //判满
void printStack(Stack * s);                 //遍历栈

栈的初始化:初始化一般是将结构内的内容进行赋值等操作。所以栈的初始化就是将数组分配一段内存,然后将长度归零。这里需要注意的是栈1指针bottom和栈2指针top,栈1指针直接指向数组起点,而栈2指针需要遍历到栈的最终端,并指向这里。

Stack * initStack(Stack * s, int maxsize)
{
    s = (Stack *)malloc(sizeof(Stack));  //分配内存
    s->Maxsize = maxsize;  //容量赋值
    s->data = (int *)malloc(sizeof(int)*maxsize);  //分配内存
    s->bottom = s->data;  //指针赋值
    s->top = s->data;
    for (int i = 0; i < maxsize; i++)  //栈2指针遍历到栈尾部
    {
        s->top++;
    }
    s->bottomLength = s->topLength = 0;  //长度归零
    return s;
}

这里写图片描述
入栈和出栈等操作一般与普通栈相似,这里不再重复提及,可参考之前写的一篇blog:

http://blog.csdn.net/sherilindas/article/details/52217485

栈的判满:当元素入栈后,指针指向下一个没有数据的单元。
这里的入栈和出栈也需要判断栈满或栈空。这里主要讲一下判满函数。因为两个指针分别在栈的两端,两个指针边入栈边往中间靠拢,当两个指针相遇时,即为栈满。所以两个指针相等时即为栈满。

int isFull(Stack * s)
{
    if 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值