每日一題16:在一個數組中實現兩個棧

在一個數組中實現兩個棧,當數組未填滿是任一個棧不能溢出。解法是將一個棧從頭開始往後插入,而另一個從後往前插入,如果插入一個元素後,兩個棧的top指針未相遇,則表示數組未滿,棧沒有溢出。

#include "stdafx.h"
#include <iostream>

using namespace std;


struct special_stack
{
    int capcity;
    int ltop,rtop;
    int* vals;
};

special_stack* create(int capacity)
{
    special_stack* sstack = new special_stack;
    sstack->vals = new int[capacity];
    sstack->capcity = capacity;
    sstack->ltop = -1;
    sstack->rtop = capacity;
    return sstack;
}

bool lpush(special_stack** sstack,int val)
{
    if((*sstack)->ltop + 1 == (*sstack)->rtop) return false;
    (*sstack)->vals[++((*sstack)->ltop)] = val;
    return true;
}

bool lpop(special_stack** sstack,int& val)
{
    if((*sstack)->ltop < 0) return false;
    val = (*sstack)->vals[((*sstack)->ltop)--];
    return true;
}

bool rpush(special_stack** sstack,int val)
{
    if((*sstack)->rtop - 1 == (*sstack)->ltop) return false;
    (*sstack)->vals[--((*sstack)->rtop)] = val;
    return true;
}

bool rpop(special_stack** sstack,int& val)
{
    if((*sstack)->rtop >= (*sstack)->capcity) return false;
    val = (*sstack)->vals[((*sstack)->rtop)++];
    return true;
}

void destroy(special_stack** sstack)
{
    delete [](*sstack)->vals;
    delete (*sstack);
    *sstack = NULL;
}

void clear(special_stack** sstack)
{
    (*sstack)->ltop = -1;
    (*sstack)->rtop = (*sstack)->capcity;
}


int _tmain(int argc, _TCHAR* argv[])
{
    special_stack* stack = create(20);
    for (int i = 1; i <= 10; ++i)
    {
        lpush(&stack,i);
        rpush(&stack,i + 10);
    }
    for (int i = 1; i <= 10; ++i)
    {
        int val;
        if(lpop(&stack,val))
            cout<<val<<' ';
    }
    cout<<endl;
    for (int i = 1; i <= 10; ++i)
    {
        int val;
        if(rpop(&stack,val))
            cout<<val<<' ';
    }
    cout<<endl;

    for (int i = 1; i <= 10; ++i)
    {
        lpush(&stack,i);
        rpush(&stack,i + 10);
    }

    cout<<lpush(&stack,21)<<endl;
    cout<<rpush(&stack,31)<<endl;

    int val;
    lpop(&stack,val);
    rpop(&stack,val);
    cout<<lpush(&stack,21)<<endl;
    cout<<rpush(&stack,31)<<endl;
    destroy(&stack);
    return 0;
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章