面试题:一个数组实现两个栈

一个数组实现两个栈
  • 问题分析
        利用顺序表模拟实现栈(一个数组实现一个栈)
  • 问题解决

方案一:
      一个数组从中间分为两部分,中间左端为栈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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值