###### 栈和队列之经典（下）

（4）判断元素出栈、入栈顺序的合法性。如：入栈的序列（1,2,3,4,5），出栈序列为（4,5,3,2,1）是合法序列，入栈的序列（1,2,3,4,5），出栈序列为（1,5,3,2,4）是不合法序列 。

bool Ispoporder(int *stack_in,int *stack_out,int len_in,int len_out)
{
assert(stack_in&&stack_out);
if(len_in != len_out)//排除入栈序列和出栈序列长度不相等的情况
return false;

stack<int> s;//建立辅助栈
int i = 0;
int j = 0;
for(; i<len_in;++i)
{
s.push(stack_in[i]);
while((s.top()==stack_out[j]) && s.size()>0)
{
s.pop();
++j;
}
}
if(s.size()==0)
return true;
else
return false;
}
int main()
{
int stack_in[] = {1,2,3,4,5};
int stack_out[] = { 4,5,3,2,1 }；//出栈序列合法
int stack_out[] = { 4,5,2,3,1};//出栈序列不合法
int len_in = sizeof(stack_in)/sizeof(stack_in[0]);
int len_out = sizeof(stack_out)/sizeof(stack_out[0]);
bool ret = Ispoporder(stack_in,stack_out,len_in,len_out);
if(ret)
cout<<"出栈序列合法"<<endl;
else
cout<<"出栈序列不合法"<<endl;
return 0;
}

（5）一个数组实现两个栈

class ArrayTwoStack
{
public:
ArrayTwoStack()
:_a(new int[2])
, _capacity(2)
,stack1_size(0)
,stack2_size(1)
{}

void Stack1Push(const int& x)//压栈
{
CheckCapacity();
_a[stack1_size++] = x;
}

void Stack2Push(const int& x)
{
CheckCapacity();
_a[stack2_size--] = x;
}

void Stack1Pop()//出栈
{
if (stack1_size > 0)
stack1_size--;
}

void Stack2Pop()
{
if (stack2_size < _capacity - 1)
stack2_size++;
}

const int& Stack1Top()
{
if (stack1_size != 0)
return _a[stack1_size-1];
}

const int& Stack2Top()
{
if(stack2_size != _capacity-1)
return _a[stack2_size+1];
}

size_t SizeofStack1()
{
return stack1_size;
}

size_t SizeofStack2()
{
return _capacity - 1 - stack2_size;
}

void Stack1Print()
{
for (int i = 0; i < stack1_size; i++)
{
cout << _a[i] << " ";
}
cout << endl;
}

void Stack2Print()
{
for (int i =stack2_size+1; i < _capacity; i++)
{
cout << _a[i] << " " ;
}
cout << endl;
}

protected:
void CheckCapacity()
{
if (stack2_size - stack1_size > 0)
return;
else//扩容
{
int newCapacity = _capacity * 2;
int* tmp = new int[newCapacity];
for (int i = 0; i < stack1_size; i++)
tmp[i] = _a[i];

int stack2_index = newCapacity - 1;
for (int i = _capacity - 1; i > stack2_size; i--)
tmp[stack2_index--] = _a[i];

_a = tmp;
_capacity = newCapacity;
stack2_size = stack2_index;
}
}

private:
int* _a;
int _capacity;
int stack1_size; //栈顶下标
int stack2_size;
};
int main()
{
ArrayTwoStack a1;
a1.Stack1Push(1);
a1.Stack1Push(2);
a1.Stack1Push(3);

a1.Stack2Push(4);
a1.Stack2Push(5);
a1.Stack1Print();
a1.Stack2Print();
return 0;
}

#### 算法入门经典之栈和队列篇

2016-07-17 01:55:03

#### 【面试题】栈和队列的面试题

2017-02-20 11:21:25

#### 栈和队列习题

2014年03月30日 135KB 下载

#### 栈和队列面试题（三）

2016-08-24 14:59:03

#### 队列及栈相关题目的实现

2016-05-26 21:32:58

#### 数据结构——栈和队列经典测试题

2007年07月16日 55KB 下载

#### 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 例题（17/22）

2016-02-25 21:01:18

#### 堆栈和队列的数据结构和相关操作总结

2016-09-13 12:27:51

#### 栈和队列的共同点和不同点

2015-08-24 20:47:46

#### 数据结构-栈和队列小结

2016-10-24 17:22:22