数据结构与算法之顺序栈
简介:
栈也是一种受限制的线性表,与队列刚好相反,队列的特性是先进先出,而栈的特性是先进后出;只可在其一端(栈顶)进行(进出)操作。 操作数据的一端我们通常称为栈顶(top),另外一段称为栈底(base)。栈的存储结构大致如下:
我们可以把栈结构大致看成一个装书的箱子,我们只能在箱子的顶部进行放书和拿书,先放进去的(高数)书会在箱子的最底部,后放的(英语)书会压在先放的高数上面,如果你想要拿到高数,那么就不得不先取出英语书,然后才能拿到高数书。
代码实现:
1. 初始化栈:
注意:顺序栈是以数组方式存储,下标从0开始
top为栈顶指针,base为栈底指针。
#define MAX_SIZE 128 //栈的最大容量
typedef int ElemType;
// 栈结构体
typedef struct _SqStack {
ElemType* top; //栈顶指针
ElemType* base; //栈底指针
}SqStack;
// 初始化栈
bool initSqStack(SqStack &S) {
S.base = new ElemType[MAX_SIZE];
if (!S.base) return false; //空间分配失败
S.top = S.base;
return true;
}
2. 入栈
入栈后使栈顶指针top指向下一个位置,方便下一次入栈
// 入栈
bool pushStack(SqStack& S, ElemType data) {
if (isFull(S)) return false; //判断栈是否为满
*(S.top++) = data; //将第二个参数传来的数据入栈
return true;
}
// 判断栈是否为满
bool isFull(SqStack& S) {
// MAX_SIZE 为栈的最大容量
if ((S.top - S.base) == MAX_SIZE) return true;
return false;
}
3. 出栈
因为栈顶指针是指向下一个位置的,所以先自减一后再赋值到data
// 出栈
bool popStack(SqStack& S, ElemType &data) {
if (isEmpty(S)) return false; //判断栈是否为空
data = *(--S.top);
return true;
}
// 判断栈是否为空
bool isEmpty(SqStack& S) {
if (S.top == S.base) return true;
return false;
}
4. 获取栈顶元素和栈中元素个数
由图可知,栈中元素的个数可由 栈顶指针减去栈底指针获得
// 获取栈顶元素
bool GetTopElem(SqStack& S, ElemType &data) {
if (isEmpty(S)) return false;
data = *(S.top - 1);
return true;
}
// 返回栈中元素个数
int GetSize(SqStack& S) {
return (S.top - S.base);
}
5.销毁栈
// 销毁顺序栈
void destroyStack(SqStack& S) {
if (S.base) {
//若栈存在,则释放资源
delete[] S.base;
S.top = S.base = NULL;
}
}
代码实现:
#include <iostream>
using namespace std;
#define MAX_SIZE 128 //栈的最大容量
typedef int ElemType;
// 栈结构体
typedef struct _SqStack {
ElemType* top; //栈顶指针
ElemType* base; //栈底指针
}SqStack;
bool isEmpty(SqStack& S);
bool isFull(SqStack& S);
// 初始化栈
bool initSqStack(SqStack &S) {
S.base = new ElemType[MAX_SIZE];
if (!S.base) return false; //空间分配失败
S.top = S.base;
return true;
}
// 入栈
bool pushStack(SqStack& S, ElemType data) {
if (isFull(S)) return false;
*(S.top++) = data;
return true;
}
// 出栈
bool popStack(SqStack& S, ElemType &data) {
if (isEmpty(S)) return false;
data = *(--S.top);
return true;
}
// 获取栈顶元素
bool GetTopElem(SqStack& S, ElemType &data) {
if (isEmpty(S)) return false;
data = *(S.top - 1);
return true;
}
// 返回栈中元素个数
int GetSize(SqStack& S) {
return (S.top - S.base);
}
// 判断栈是否为满
bool isFull(SqStack& S) {
if ((S.top - S.base) == MAX_SIZE) return true;
return false;
}
// 判断栈是否为空
bool isEmpty(SqStack& S) {
if (S.top == S.base) return true;
return false;
}
// 销毁顺序栈
void destroyStack(SqStack& S) {
if (S.base) {
delete[] S.base;
S.top = S.base = NULL;
}
}
int main(void) {
SqStack S;
if (initSqStack(S))
cout << "栈初始化成功!" << endl;
else
cout << "栈初始化失败!" << endl;
int data = 0;
for (size_t i = 0; i < 6; i++)
{
cout << "请输入元素:";
cin >> data;
pushStack(S,data);
}
cout << "栈中元素个数为:" << GetSize(S) << endl;
cout << "出栈元素为:";
for (size_t i = 0; i < 6; i++)
{
popStack(S, data);
cout << data << " ";
}
cout << endl;
cout << "栈中元素个数为:" << GetSize(S) << endl;
destroyStack(S);
return 0;
}