C语言数据结构

用一个数组实现两个堆栈

2017-06-28  本文已影响33人  tingshuo123

请用一个数组实现两个堆栈, 要求最大地利用数组空间, 使数组只要有空间入栈操作就可以成功。

思路:使这两个栈分别从数组的两头开始, 并向中间增长; 当两个栈的栈顶指针相遇(不是相等)时, 表示两个栈都满了。

IMG_20170628_183147.jpg

伪码实现:

#define MAXSIZE 10 //存储元素的最大个数
#define bool int
#define True 1
#define Flase 0

typedef struct {
    element_type data[MAXSIZE];
    int top1;
    int top2;
} stack;

stack s;    // 声明结构变量 s

// 两个栈为空的位置
s.top1 = -1;
s.top2 = MAXSIZE;

// 入栈
void push(stack *s, element_type item, int tag)
{
    if ((s->top2) - (s->top1) != 1){
        // 选择要操作的栈
        if (tag == 1){
            s->data[(s->top1)+1] = item;    // 向右填充
            s->top1++;
        } else {
            s->data[(s->top2)-1] = item;    // 向左填充
            s->top2--;
        }
    }
}

// 出栈
element_type pop(stack *s, int tag)
{
    element_type n = NULL;
    if (tag == 1){
        if (s->top1 != -1){
            n = s->data[(s->top1--)];
        }
    } else {
        if (s->top2 != MAXSIZE){
            n = s->data[(s->top2--)];
        }
    }
    return n;
}

// 判断两个堆栈是全否为空
bool is_empty(stack *s, int n)
{
    bool flag = False;
    if ((s->top1 == -1) && (s->top2 == n)){
        flag = True;
    }
    
    return flag;
}

// 判断是否满了
bool is_full(stack *s)
{
    bool flag = False;
    if (s->top2 - s->top1 == 1){
        flag = True;
    }
    
    return flag;
}
上一篇 下一篇

猜你喜欢

热点阅读