美文网首页C语言数据结构
用一个数组实现两个堆栈

用一个数组实现两个堆栈

作者: tingshuo123 | 来源:发表于2017-06-28 19:12 被阅读33次

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

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

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

    相关文章

      网友评论

        本文标题:用一个数组实现两个堆栈

        本文链接:https://www.haomeiwen.com/subject/przucxtx.html