面試題:一個數組實現兩個棧

一個數組實現兩個棧
  • 問題分析
        利用順序表模擬實現棧(一個數組實現一個棧)
  • 問題解決

方案一:
     一個數組從中間分爲兩部分,中間左端爲棧1,中間右端爲棧2;
     示例圖:

     
存在缺點:方案一會存在當一個棧滿了,另一個棧還是空的的現象,這樣產生浪費空間的問題。
方案二:
      一個數組的兩端分別作爲兩個棧的棧底,每個棧的壓棧操作都是向着另一個棧的棧底進行,兩個棧頂碰頭表示堆棧已滿;
      示例圖:

  • 問題實現
基於方案二的基本數據結構:
template<class T>
class ArrayToTwoStack
{
public:
    ArrayToTwoStack( int MaxSize );
    ~ArrayToTwoStack();
    void _push(constT& x,intchoice);          //入棧
    void _pop(int choice);                   //出棧
    bool _empty(intchoice);                 //判空
    T& _top(int choice);                   //棧頂元素
    size_t _size(int choice);             //棧大小
private:
    T* _array;
    int _sz1;                           //棧1大小
    int _sz2;                          //棧2大小
    int _sz;                          //數組長度
};
代碼實現:
//ArrayToTwoStack.h
#include <iostream>
using namespace std;

template<class T>
class ArrayToTwoStack
{
public:
	ArrayToTwoStack(int MaxSize)
		:_array(new T[MaxSize])
		,_sz1(0)
		,_sz2(MaxSize-1)
		,_sz(MaxSize)
	{ 
	}

	~ArrayToTwoStack()
	{
		if(NULL == _array)
		{
			delete[] _array;
			_sz1=0;
			_sz2=0;
			_sz=0;
		}
	}

	void _push(const T& x,int choice)
	{
		if(_sz1 > _sz2)
		{
			cout<<"Stack Is Full"<<endl;
			return;
		}
		else if(choice == 1)
		{
			_array[_sz1++]=x;
		}
		else
		{
			_array[_sz2--]=x;
		}
	}

	void _pop(int choice)
	{
		if(choice == 1)
		{
			if(_sz1 < 0)
			{
				cout<<"Stack1 Is Empty"<<endl;
				return;
			}
			else
			{
				_sz1--;
			}
		}
		else
		{
			if(_sz2 > _sz)
			{
				cout<<"Stack2 Is Empty"<<endl;
				return;
			}
			else
			{
				_sz2++;
			}
		}
	}

	bool _empty(int choice)
	{
		if(choice == 1 && _sz1 < 0)
		{
			cout<<"Stack1 Is Empty"<<endl;
			return true;
		}
		else if(choice == 2 && _sz2 > _sz)
		{
			cout<<"Stack2 Is Empty"<<endl;
			return true;
		}
		return false;
	}

	T& _top(int choice)
	{
		if(choice == 1)
		{
			return _array[_sz1-1];
		}
		else
		{
			return _array[_sz2+1];
		}
	}

	size_t _size(int choice)
	{
		if(choice == 1)
		{
			return _sz1;
		}
		if(choice == 2)
		{
			return _sz-_sz2-1;
		}
	}

	void _print()
	{
		for(int i=0;i<_sz;i++)
		{
			cout<<_array[i]<<" ";
		}
		cout<<endl;
	}
private:
	T* _array;
	int _sz1;
	int _sz2;
	int _sz;
};
//test.cpp
#include "ArrayToStack.h"

void test1()
{
	//choice爲1表示對棧1操作,choice爲2表示對棧2操作
	ArrayToTwoStack<int> as(10);
	//壓棧
	as._push(1,1);
	as._push(2,1);
	as._push(3,1);
	as._push(4,1);
	as._push(1,2);
	as._push(2,2);
	as._push(3,2);
	as._push(4,2);
	as._print();
	//出棧
	as._pop(1);
	cout<<"Size of stack1 is:"<<as._size(1)<<endl;
	//判空
	cout<<"Stack is empty or not:"<<as._empty(1)<<endl;
	//棧大小
	cout<<"Size of stack2 is:"<<as._size(2)<<endl;
	//棧頂元素
	cout<<"Top of stack2 is:"<<as._top(2)<<endl;
}

int main()
{
	test1();
	getchar();
	return 0;
}


發佈了49 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章