栈在之前的STL学习中就已经接触过了,现在到了自己手写栈的时候了。自己去写一个特殊线性表挑战感觉还是挺大的,后来看其实和写线性表大致相同,只要写出栈的特性特点就可以,其他的基本相同。
特殊线性表——栈
栈的逻辑结构
栈:限定仅在表尾进行插入和删除操作的线性表。
空栈:不含任何数据元素的栈。
运行插入和删除的一端称为栈顶,另一端成为栈底。
栈栈的操作特性:后进先出
栈的顺序存储结构及实现
const int MAX_SIZE = 100;
template<class T>
class stack
{
public:
stack();
~stack();
void push(T x);
T pop();
T GetTop();
bool Empty();
private:
T data[MAX_SIZE];
int top;
}
构造函数、析构函数、栈的遍历
stack()
{
top = -1;
}
~stack() {}
void Print()
{
if (top >= 0)
{
for (int i = 0; i <= top; ++i)
{
cout << data[i] << endl;
}
}
}
栈的插入、删除操作
void push(T x)
{
top++;
data[top] = x;
}
T pop()
{
T x;
x = data[top];
top--;
return x;
}
取栈顶元素、判断是否为空栈
T GetTop()
{
return data[top];
}
bool Empty()
{
if (top == -1)
return true;
return false;
}
双端顺序栈
双端顺序栈就是把两个顺序栈组合到了一起,一个栈的top1从0开始,存入数据后top1++,而另一个栈从尾开始,存入数据后top2–,而当top1+1=top2时,我们的双端栈就达到了栈满状态了。
栈满状态图:
双端顺序栈的声明
const int Stack_Size=100;
template <class T>
class BothStack
{
public:
BothStack( );
~BothStack( );
void Push(int i, T x);
T Pop(int i);
T GetTop(int i);
bool Empty(int i);
private:
T data[Stack_Size];
int top1, top2;
};
双端顺序栈的所有代码
#include<iostream>
using namespace std;
const int Stack_Size = 100;
template <class T>
class BothStack
{
private:
T data[Stack_Size];
int top1, top2;
public:
BothStack() // 构造函数
{
top1 = -1;
top2 = Stack_Size;
}
~BothStack(){}
void Push(int i, T x) // 插入操作
{
if (i == 1)
{
top1++;
data[top1] = x;
}
if (i == 2)
{
top2--;
data[top2] = x;
}
}
T Pop(int i) // 删除操作
{
if (i == 1)
{
if (top1 == -1)throw"下溢";
return data[top1--];
}
if (i == 2)
{
if (top2 == Stack_Size)throw"下溢";
return data[top2++];
}
}
T GetTop(int i)
{
if (i == 1)
{
if (top1 != -1)
return data[top1];
}
if (i == 2)
{
if (top2 != Stack_Size)
return data[top2];
}
}
bool Empty(int i)
{
if (i == 1)
{
if (top1 == -1)
return true;
return false;
}
if (i == 2)
{
if (top2 == Stack_Size)
return true;
return false;
}
}
void Print()
{
cout << "top1:" << endl;
for (int i = 0; i <= top1; ++i)
{
cout << data[i] << " ";
}
cout << endl;
cout << "top2:" << endl;
for (int i = Stack_Size - 1; i >= top2; --i)
{
cout << data[i] << " ";
}
cout << endl;
}
};
int main()
{
BothStack<int>bs;
bs.Push(1, 1);
bs.Push(1, 2);
bs.Push(2, 10);
bs.Push(2, 9);
bs.Print();
bs.Pop(1);
bs.Pop(2);
bs.Print();
return 0;
}
双端顺序栈其实也没有什么特别大的难度,就是栈的组合,之后就要学习比较难的链式栈了,要加油鸭!