共享栈,就是相当于用一个数组,俩端分别为栈底,相向生长。
思路如下:
效果图:
代码实现:
sharestack.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE printf("-------------------%s------------------\n",__FUNCTION__);
#define DataType char
#define sharestackMaxSize 10//定义数组的最大值
//定义共享栈的结构体
typedef struct sharestack{
DataType arr[sharestackMaxSize];
size_t index;
size_t index2;
}sharestack;
//初始化
void stackInit(sharestack* stack)
{
if(stack == NULL)
{
return;
}
memset(stack->arr,' ',sharestackMaxSize);
stack->index = 0;
stack->index2 = sharestackMaxSize;
}
//入栈1
void stackPush1(sharestack* stack,DataType value)
{
if(stack == NULL)
{
return;
}
if(stack->index == stack->index2)
{
printf("共享栈此时已经满了 !\n");
return;
}
stack->arr[stack->index] = value;
++(stack->index);
}
//入栈2
void stackPush2(sharestack* stack,DataType value)
{
if(stack == NULL)
{
return;
}
if(stack->index2 == stack->index)
{
printf("共享栈此时已经满了 !\n");
return;
}
stack->arr[stack->index2-1] = value;
--(stack->index2);
}
//出栈1
void stackPop1(sharestack* stack)
{
if(stack == NULL)
{
return;
}
if(stack->index == 0)
{
printf("栈1为空栈!\n");
return;
}
stack->arr[stack->index-1] = ' ';
--(stack->index);
}
//出栈2
void stackPop2(sharestack* stack)
{
if(stack == NULL)
{
return;
}
if(stack->index2 == sharestackMaxSize)
{
printf("栈2为空栈!\n");
return;
}
stack->arr[stack->index2] = ' ';
++(stack->index2);
}
//取栈1的栈顶
DataType stackTop1(sharestack* stack)
{
if(stack == NULL)
{
return;
}
return stack->arr[stack->index-1];
}
//取栈2的栈顶
DataType stackTop2(sharestack* stack)
{
if(stack == NULL)
{
return;
}
return stack->arr[stack->index2];
}
//-----------------------------------------------------------------
//----------测试函数
//-----------------------------------------------------------------
//打印函数
void stackprint(sharestack* stack)
{
if(stack == NULL)
{
return;
}
printf("stack1:[%-10s]:stack2",stack->arr);
printf("\n");
}
void teststack()
{
LINE;
sharestack stack;
stackInit(&stack);
printf("栈1栈2各入栈5个:\n");
stackPush1(&stack,'a');
stackPush2(&stack,'a');
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPush1(&stack,'b');
stackPush2(&stack,'b');
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPush1(&stack,'c');
stackPush2(&stack,'c');
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPush1(&stack,'d');
stackPush2(&stack,'d');
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPush1(&stack,'e');
stackPush2(&stack,'e');
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
printf("\n栈1栈2各出栈5个:\n");
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPop1(&stack);
stackPop2(&stack);
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPop1(&stack);
stackPop2(&stack);
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPop1(&stack);
stackPop2(&stack);
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPop1(&stack);
stackPop2(&stack);
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
stackPop1(&stack);
stackPop2(&stack);
stackprint(&stack);
printf("栈1的栈顶:%c, 栈2的栈顶:%c\n",stackTop1(&stack),stackTop2(&stack));
}
int main()
{
teststack();
return 0;
}