用一个数组实现一个栈&&元素出栈,入栈的合法性
程序员文章站
2022-03-27 14:16:21
...
用一个数组实现一个栈
采用如下图示方法:以两头向中间增长,push的时候将插入的数据压入到size1或size2的位置,size1++,size2–;pop的时候刚好相反,size1–,size2++;
取top的时候需要判断size1大于0,size2是否越界,小于_capacity
因为这里使用数组进行实现的,会牵扯到扩容得问题,这里在扩容的时候需要新开辟一块新的空间,将size1大小的数据拷贝到新空间的前面,将size2大小的数据拷贝到新空间的后面(注意size2的计算),将原空间释放
代码实现:
//用一个数组实现两个栈
//解决的方案是从两头开始向中间增长,因为是数组所以特别注意的是容量是否满了
template<class T>
class Stack
{
public:
Stack()
:_arr(new int [2])
, size1(0)
, size2(1)
, _capacity(2)
{}
~Stack()
{
if (_arr != NULL)
{
delete[] _arr;
_arr = NULL;
size1 = 0;
size2 = 0;
_capacity = 0;
}
}
void Push1(const T& x)
{
CheckCapacity();
_arr[size1] = x;
size1++;
}
void Push2(const T& x)
{
CheckCapacity();
_arr[size2] = x;
size2--;
}
void Pop1()
{
if (size1 > 0)
{
size1--;
}
}
void Pop2()
{
if (size2 != _capacity - 1)
{
size2++;
}
}
T& Top1()
{
if (size1 > 0)
{
return _arr[size1];
}
}
T& Top2()
{
if (size2 > 0)
{
return _arr[size2];
}
}
private:
void CheckCapacity()
{
if (size1 + size2 <= _capacity)
{
int newCapacity = _capacity + 10;
T* tmp = new T[newCapacity];
int k = newCapacity - 1;
//将前后两个数据段进行拷贝
for (int i = 0; i < size1; ++i)
{
tmp[i] = _arr[i];
}
for (int i = _capacity - 1; i>_capacity - size2; --i)
{
tmp[k] = _arr[i];
k--;
}
delete[] _arr;
size2 = newCapacity - (_capacity - size2);
_capacity = newCapacity;
_arr = tmp;
}
}
T* _arr;
int size1;
int size2;
int _capacity;
};
元素出栈,入栈的合法性判断
代码实现:
//元素出栈,入栈顺序的合法性
template<class T>
class Check
{
public:
bool Check_Output(T* input, T* output, size_t len1, size_t len2)
{
assert(input);
assert(output);
if (len1 != len2)
{
return false;
}
stack<T> s;
int j = 0;
for (int i = 0; i < len1; ++i)
{
s.push(input[i]);
while (s.size()>0 && s.top() == output[j])
{
s.pop();
j++;
}
}
return s.size() > 0 ? false : true;
}
};
int main()
{
int arr1[] = { 1, 2, 3, 4, 5 };
size_t len1 = sizeof(arr1) / sizeof(arr1[0]);
int arr2[] = { 4, 5, 2, 2, 1 };
size_t len2 = sizeof(arr2) / sizeof(arr2[0]);
Check<int> c;
cout << c.Check_Output(arr1, arr2, len1, len2) << endl;
system("pause");
}
推荐阅读
-
基于自定义的动态数组实现一个栈(Java语言)
-
C++实现用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型
-
算法————双栈实现队列、双队列实现栈、实现一个栈Push(出栈)Pop(入栈)Min(返回最小值的操作)的时间复杂度为O(1)
-
用一个栈实现另一个栈的排序
-
判断元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列
-
array_push php array_push数组函数:将一个或多个单元压入数组的末尾(入栈)
-
判断两数组,第一个为入栈顺序,第二个可否为出栈顺序
-
算法1---实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
-
算法题目---------------01.实现一个特殊的栈,在栈的基本功能上,在实现返回栈中最小的元素
-
【每日一题】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)