一个数组实现两个栈
- 问题分析
利用顺序表模拟实现栈(一个数组实现一个栈)
- 问题解决
方案一:
一个数组从中间分为两部分,中间左端为栈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;
}