1. 程式人生 > >ADT - 兩個棧共享一個數組

ADT - 兩個棧共享一個數組

ray () != ret con div pty for clas

  大晚上實在睡不著,就去碼代碼...然後想起這個我一直沒寫過,就想試試,然後實現了這個數據結構,因為不知道對這個題目理解對不對...所以如果不正確,還望不吝指正。

  寫的時候倒是沒有什麽難的地方,然後寫完之後幾乎一次編譯就過了,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 - 兩個棧共享一個數組