为什么用共用栈:栈的顺序存储还是很方便的,但是当一个栈的容量空间不够了,我们就需要另开辟一段内存,这很麻烦。所以,我们干脆弄一个足够大的内存空间,然后让两个数据类型相同的栈来共享这个空间。
共用栈的实现原理:共享栈,即是两个栈使用同一段存储空间。第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间延伸。
参考博客:
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:
栈的判满:当元素入栈后,指针指向下一个没有数据的单元。
这里的入栈和出栈也需要判断栈满或栈空。这里主要讲一下判满函数。因为两个指针分别在栈的两端,两个指针边入栈边往中间靠拢,当两个指针相遇时,即为栈满。所以两个指针相等时即为栈满。
int isFull(Stack * s)
{
if