两个栈共享一个数组

  代码:

#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;
}

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

转载于:https://www.cnblogs.com/darkchii/p/7636465.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值