How to implement three stacks using a single array

后端 未结 17 803
情书的邮戳
情书的邮戳 2020-12-23 15:10

I came across this problem in an interview website. The problem asks for efficiently implement three stacks in a single array, such that no stack overflows until there is no

17条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-23 16:00

    May be this can help you a bit...i wrote it by myself :)

    // by ashakiran bhatter
    // compile: g++ -std=c++11 test.cpp
    // run    : ./a.out
    // sample output as below
    // adding:  1 2 3 4 5 6 7 8 9
    // array contents:  9 8 7 6 5 4 3 2 1
    // popping now...
    // array contents:  8 7 6 5 4 3 2 1
    
    
    #include 
    #include 
    
    #define MAX_LEN 9
    #define LOWER   0
    #define UPPER   1
    #define FULL   -1
    #define NOT_SET -1
    
    class CStack
    {
    private:
         int8_t array[MAX_LEN];
         int8_t stack1_range[2];
         int8_t stack2_range[2];
         int8_t stack3_range[2];
         int8_t stack1_size;
         int8_t stack2_size;
         int8_t stack3_size;
         int8_t stack1_cursize;
         int8_t stack2_cursize;
         int8_t stack3_cursize;
         int8_t stack1_curpos;
         int8_t stack2_curpos;
         int8_t stack3_curpos;
    public:
         CStack();
        ~CStack();
    
         void push(int8_t data);
         void pop();
         void print();
    };
    
    CStack::CStack()
    {
         stack1_range[LOWER] = 0;
         stack1_range[UPPER] = MAX_LEN/3 - 1;
         stack2_range[LOWER] = MAX_LEN/3;
         stack2_range[UPPER] = (2 * (MAX_LEN/3)) - 1;
         stack3_range[LOWER] = 2 * (MAX_LEN/3);
         stack3_range[UPPER] = MAX_LEN - 1;
    
         stack1_size = stack1_range[UPPER] - stack1_range[LOWER];
         stack2_size = stack2_range[UPPER] - stack2_range[LOWER];
         stack3_size = stack3_range[UPPER] - stack3_range[LOWER];
    
         stack1_cursize = stack1_size;
         stack2_cursize = stack2_size;
         stack3_cursize = stack3_size;
    
         stack1_curpos = stack1_cursize;
         stack2_curpos = stack2_cursize;
         stack3_curpos = stack3_cursize;
    }
    
    CStack::~CStack()
    {
    }
    
    void CStack::push(int8_t data)
    {
         if(stack3_cursize != FULL) 
         {
              array[stack3_range[LOWER] + stack3_curpos--] = data;
              stack3_cursize--;
         } else if(stack2_cursize != FULL) {
              array[stack2_range[LOWER] + stack2_curpos--] = data;
              stack2_cursize--;
         } else if(stack1_cursize != FULL) {   
              array[stack1_range[LOWER] + stack1_curpos--] = data;
              stack1_cursize--;
         } else {
              std::cout<<"\tstack is full...!"<(array[i]);
         for(int8_t i = stack2_range[LOWER] + stack2_curpos + 1; i <=  stack2_range[UPPER]; i++)
              std::cout<<" "<(array[i]);
         for(int8_t i = stack3_range[LOWER] + stack3_curpos + 1; i <=  stack3_range[UPPER]; i++)
              std::cout<<" "<(array[i]);
         std::cout<<"\n";    
    }
    
    int main()
    {
         CStack stack;
    
         std::cout<<"adding: ";
         for(uint8_t i = 1; i < 10; i++) 
         {
              std::cout<<" "<(i);
              stack.push(i);
         }
         std::cout<<"\n";
    
         stack.print();
    
         stack.pop();
    
         stack.print();
    
    
         return 0;
    }

提交回复
热议问题