一个数组实现两个栈 c语言,一个数组实现两个栈

题目:

一个数组A[1..n]来实现两个栈,使得两个栈中的元素总和不到n时,两个都不会发生上溯。

思路(1):

创建一个数组,分别从两边开始,依次往中间走。

1c873351fbf4d257288afb62105e96d7.png

思路(2):

创建一个数组,一个走奇数位,一个走偶数位。

811195785dfb469626cfcd587a3fe3e6.png//奇偶方式

#define  _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

template

class TwoStack

{

public:

TwoStack(int size)

:_top1(-1), _top2(-1), _len(size)

{

_arr = new T[size];

}

~TwoStack()

{

if (_arr)

{

delete[] _arr;

}

}

void Push(int index, int data);

T Pop(int index);

bool IsEmpty(int index);

void Disp();

T Top(int index);

private:

int _top1;

int _top2;

int _len;

T* _arr;

};

template

void TwoStack::Push(int index, int data)

{

//if (_len % 2 == 0)

//{

//if (_top1>_len-2 || _top2>=_len-1)

//{

//cout <

//return;

//}

//}

//else

//{

//if (_top1 >_len || _top2 >= _len - 2)

//{

//cout <

//return;

//}

//}

int flag = _len % 2;

if (index == 0)

{

if (flag == 0)

{

if (_top1 >= _len - 2)

{

cout <

return;

}

}

if (flag == 1)

{

if (_top1 >= _len - 1)

{

cout <

return;

}

}

if (_top1 == -1)

{

_top1 = 0;

_arr[_top1] = data;

}

else

{

_top1+=2;

_arr[_top1] = data;

}

}

/

else

{

if (flag == 0)

{

if (_top2 >= _len - 2)

{

cout <

return;

}

}

if (flag == 1)

{

if (_top2 >= _len - 1)

{

cout <

return;

}

}

///

if (_top2 == -1)

{

_top2 = 1;

_arr[_top2] = data;

}

else

{

_top2+=2;

_arr[_top2] = data;

}

}

}

template

T TwoStack::Pop(int index)

{

int ret;

if (index == 0)

{

if (_top1 

{

cout <

return -1;

}

else

{

ret = _arr[_top1];

_top1-=2;

}

}

else

{

if (_top2 <1)

{

cout <

return -1;

}

else

{

ret = _arr[_top2];

_top2-=2;

}

}

return ret;

}

template

bool TwoStack::IsEmpty(int index)

{

if (index == 0 && _top1 

return true;

if (index == 1 && _top2 

return true;

return false;

}

template

void TwoStack::Disp()

{

{

for (int i = 0; i 

{

cout <

}

}

}

template

T TwoStack::Top(int index)

{

if (0 == index && _top1 >= 0)

{

return _arr[_top1];

}

if (1 == index && _top2 >=1)

{

return _arr[_top2];

}

cout <

exit(0);

}

void test1()

{

TwoStacks(10);

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

//s.Push(0, 5);

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

//s.Push(1, 10);

//cout <

//cout<

s.Disp();

}

void test2()

{

TwoStacks(10);

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

//cout<

}

int main()

{

test1();

test2();

system("pause");

return  0;

}

一前一后向中间走:#define  _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

template

class TwoStack

{

public:

TwoStack(int size)

:_top1(-1), _top2(size), _len(size)

{

_arr = new T[size];

}

~TwoStack()

{

if (_arr)

{

delete[] _arr;

}

}

void Push(int index, int data);

T Pop(int index);

bool IsEmpty(int index);

void Disp();

T Top(int index);

private:

int _top1;

int _top2;

int _len;

T* _arr;

};

template

void TwoStack::Push(int index, int data)

{

if (_top1 >= _top2 - 1)

{

cout <

return;

}

if (index == 0)

{

_top1++;

_arr[_top1] = data;

}

else

{

_top2--;

_arr[_top2] = data;

}

}

template

T TwoStack::Pop(int index)

{

int ret;

if (index == 0)

{

if (_top1 

{

cout<

return -1;

}

else

{

ret = _arr[_top1];

_top1--;

}

}

else

{

if (_top2 > _len)

{

cout <

return -1;

}

else

{

ret = _arr[_top2];

_top2++;

}

}

return ret;

}

template

bool TwoStack::IsEmpty(int index)

{

if (index == 0 && _top1 

return true;

if (index == 1 && _top2 >= _len)

return true;

return false;

}

template

void TwoStack::Disp()

{

{

for (int i = 0; i 

{

cout <

}

}

}

template

T TwoStack::Top(int index)

{

if (0 == index && _top1>=0)

{

return _arr[_top1];

}

if (1 == index && _top2 

{

return _arr[_top2];

}

cout <

exit(0);

}

void test1()

{

TwoStacks(10);

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

//s.Push(0, 5);

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

//s.Push(1, 10);

s.Disp();

//cout <

}

void test2()

{

TwoStacks(10);

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

//cout<

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

//cout<

}

int main()

{

test1();

//test2();

system("pause");

return  0;

}

动态实现增长:

#define  _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

template

class TwoStack

{

public:

TwoStack()

:_top1(-1), _top2(-1), _len(0), _arr(NULL), _capacity(0)

{

}

~TwoStack()

{

if (_arr)

{

delete[] _arr;

}

}

void Push(int index, int data);

T Pop(int index);

bool IsEmpty(int index);

void Disp();

T Top(int index);

void IncreaseCapcity();

private:

int _top1;

int _top2;

int _len;

T* _arr;

int _capacity;

};

template

void TwoStack::IncreaseCapcity()

{

int top1 = _top1;

int top2 = _top2;

int size = _capacity;

_capacity = _len * 2 + 3;

int capacity = _len * 2 + 3;

int newlen = capacity;

T* tmp = new T[_capacity];

if (_arr != NULL)

{

for (int i = 0; i <= top1; i++)

{

tmp[i] = _arr[i];

}

for (int j = top1 + 1; j 

{

tmp[--capacity] = _arr[--_len];

--newlen;

}

}

if (_arr != NULL)

{

delete[] _arr;

}

_arr = tmp;

_len = newlen;

_top2 = _len;

}

template

void TwoStack::Push(int index, int data)

{

if (_top1 >= _top2 - 1)

{

IncreaseCapcity();

}

if (index == 0)

{

_top1++;

_arr[_top1] = data;

}

else

{

_top2--;

_arr[_top2] = data;

}

}

template

T TwoStack::Pop(int index)

{

int ret;

if (index == 0)

{

if (_top1 

{

cout<

return -1;

}

else

{

ret = _arr[_top1];

_top1--;

}

}

else

{

if (_top2 > _len)

{

cout <

return -1;

}

else

{

ret = _arr[_top2];

_top2++;

}

}

return ret;

}

template

bool TwoStack::IsEmpty(int index)

{

if (index == 0 && _top1 

return true;

if (index == 1 && _top2 >= _len)

return true;

return false;

}

template

void TwoStack::Disp()

{

{

for (int i = 0; i 

{

cout <

}

}

}

template

T TwoStack::Top(int index)

{

if (0 == index && _top1>=0)

{

return _arr[_top1];

}

if (1 == index && _top2 

{

return _arr[_top2];

}

cout <

exit(0);

}

void test1()

{

TwoStacks;

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

//s.Push(0, 5);

//cout <

//cout <

//cout <

//cout <

//cout <

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

//s.Push(1, 10);

s.Disp();

//cout <

}

void test2()

{

TwoStacks;

s.Push(0, 1);

s.Push(0, 2);

s.Push(0, 3);

s.Push(0, 4);

s.Push(0, 5);

s.Push(1, 6);

s.Push(1, 7);

s.Push(1, 8);

s.Push(1, 9);

s.Push(1, 10);

//cout<

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

cout <

//cout<

}

int main()

{

test1();

//test2();

system("pause");

return  0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值