ADT - 两个栈共享一个数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADT - 两个栈共享一个数组相关的知识,希望对你有一定的参考价值。

  大晚上实在睡不着,就去码代码...然后想起这个我一直没写过,就想试试,然后实现了这个数据结构,因为不知道对这个题目理解对不对...所以如果不正确,还望不吝指正。

  写的时候倒是没有什么难的地方,然后写完之后几乎一次编译就过了,hhh,实际上还是有几个标点符号忘记写。。。也算有一点进步吧~

/**
 *      一个数组实现两个栈
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define bool int
#define false 0
#define true 1

#define ArrayMax 10
#define Empty -1

typedef struct ArrStack {
    int* val;
    int base;       //栈1底
    int top;        //栈2底
}TwoStack;

/*初始化栈*/
TwoStack* initStack(void)
{
    TwoStack* stack;
    stack = (TwoStack*)malloc(sizeof(TwoStack));
    stack->val = (int*)malloc(sizeof(int));
    stack->base = -1;
    stack->top = ArrayMax;

    return stack;
}

/**判断栈1是否为空的条件*/
bool EmptyStack_1(TwoStack* stack)
{
    return stack->base == Empty;
}

/**判断栈2是否为空的条件*/
bool EmptyStack_2(TwoStack* stack)
{
    return stack->top == ArrayMax;
}
/**
 *  判断栈是否满
 *
 */
bool FullStack(TwoStack* stack)
{
    return stack->base + 1 == stack->top;   //满足数组大小
}
/**栈1-进栈*/
bool PushStack_1(TwoStack* stack, int X)
{
    if(FullStack(stack))
    {
        fprintf(stderr,"Stack overflow!\n");
        return false;
    }
    stack->val[++stack->base] = X;

    return true;
}
/**栈2-进栈*/
bool PushStack_2(TwoStack* stack, int X)
{
    if(FullStack(stack))
    {
        fprintf(stderr,"Stack overflow!\n");
        return false;
    }
    stack->val[--stack->top] = X;

    return true;
}
/**栈1-出栈*/
bool PopStack_1(TwoStack* stack)
{
    if(EmptyStack_1(stack))
    {
        return false;
    }
    --stack->base;

    return true;
}
/**栈2-出栈*/
bool PopStack_2(TwoStack* stack)
{
    if(EmptyStack_2(stack))
    {
        return false;
    }
    ++stack->top;

    return true;
}
/**获取栈1的顶*/
int GetTopStack_1(TwoStack * stack)
{
    return stack->base;
}
/**获取栈2的顶*/
int GetTopStack_2(TwoStack * stack)
{
    return stack->top;
}

int main(void)
{
    TwoStack* Stack;
	int i;
    int X;
    char c;

    Stack = initStack();

    puts("1) 进栈1    2) 进栈2");
    puts("3) 出栈1    4) 出栈2");
    puts("5) 栈1顶元素      6) 栈2顶元素");
    puts("7) 查看栈1  8) 查看栈2");
    puts("9) 退出");
    while((c = getch()) != ‘9‘)
    {
        switch(c)
        {
        case ‘1‘ :  printf("\n栈1—输入数据:");
                    scanf("%d", &X);
                    PushStack_1(Stack, X);
                break;
        case ‘2‘ :  printf("\n栈2—输入数据:");
                    scanf("%d", &X);
                    PushStack_2(Stack, X);
                break;
        case ‘3‘ :  printf("栈1—出栈\n");
                    PopStack_1(Stack);
                break;
        case ‘4‘ :  printf("栈2—出栈\n");
                    PopStack_2(Stack);
                break;
        case ‘5‘ :  printf("当前栈1—顶元素为: %d\n", Stack->val[GetTopStack_1(Stack)]);
                break;
        case ‘6‘ :  printf("当前栈2—顶元素为: %d\n", Stack->val[GetTopStack_2(Stack)]);
                break;
        case ‘7‘ :  printf("栈1—所有元素为:");
                    for(i = 0; i <= GetTopStack_1(Stack); i++)
                        printf("%d ", Stack->val[i]);
                    printf("\n");
                break;
        case ‘8‘ :  printf("栈2—所有元素为:");
                    for(i = ArrayMax - 1; i >= Stack->top; i--)
                        printf("%d ", Stack->val[i]);
                    printf("\n");
                break;
        }
    }
    free(Stack);
    free(Stack->val);

    return 0;
}

  时间也不早了,先休息了  = =

  最后,谢谢观看~~

以上是关于ADT - 两个栈共享一个数组的主要内容,如果未能解决你的问题,请参考以下文章

两栈共享存储空间

使用一维数组实现共享栈操作

栈 ADT

数据结构两栈共享空间

数据结构与算法分析 - 2 - 栈ADT

栈文档之共享栈