一個數組實現兩個棧
利用順序表模擬實現棧(一個數組實現一個棧)
方案一:
一個數組從中間分爲兩部分,中間左端爲棧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;
}