数据结构C++——栈
文章目录
一、顺序栈的一些常见操作
①顺序栈的存储结构
顺序栈的存储结构
/*---------顺序栈的存储结构--------*/
#define MAXSIZE 100
#define OK 1
#define ERROR 0;
typedef int Status;
typedef int SElemType;
typedef struct {
SElemType* base;//栈底指针
SElemType* top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
②顺序栈的初始化
顺序栈的初始化
Status InitStack(SqStack& S) {//构造一个空栈
S.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if (!S.base) exit(OVERFLOW);//存储分配失败
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
③顺序栈的入栈
顺序栈的入栈
Status Push(SqStack& S, SElemType e) {//插入元素e为新的栈顶元素
if (S.top-S.base==S.stacksize) return ERROR;
*S.top = e;
S.top++;
return OK;
}
④顺序栈的出栈
顺序栈的出栈
Status Pop(SqStack& S, SElemType& e) {
if (S.top == S.base) return ERROR;
--S.top;
e = *S.top;
return OK;
}
⑤取栈顶元素
取栈顶元素
。
SElemType GetTop(SqStack S) {
if (S.top != S.base)//栈非空
return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
}
----------------------------------一道华丽的分割线---------------------------------
二、链栈的一些常见操作
①链栈的存储结构
链栈的存储结构
typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
/*---------链栈的存储结构--------*/
typedef struct StackNode {
ElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
②链栈的初始化
链栈的初始化
/*---------链栈的初始化---------*/
/*链栈的初始化操作就是构造一个空栈,因为没必要设头结点,所以直接将栈顶指针置空即可*/
Status InitStack(LinkStack& S) {
//构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
③链栈的入栈
链栈的入栈
/*---------链栈的入栈-----------*/
Status Push(LinkStack& S,ElemType e) {
//在栈顶插入元素e
StackNode* p = new StackNode;
p->data = e;//将新结点数据域置为e
p->next = S;//将新结点插入栈顶
S = p;//修改栈顶指针为p
return OK;
}
④链栈的出栈
链栈的出栈
/*--------链栈的出栈------------*/
Status Pop(LinkStack& S, ElemType& e) {
if (S == NULL) return ERROR;//栈空
e = S->data;//将栈顶元素赋给e
StackNode* p = new StackNode;
p = S;//用p临时保存栈顶元素空间,以备释放
S = S->next;//修改栈顶指针
delete p;//释放原栈顶元素的空间
return OK;
}
⑤取栈顶元素
取栈顶元素
。
/*--------取栈顶元素------------*/
Status GetTop(LinkStack& S) {
//返回S的栈顶元素,不修改栈顶指针
if (S != NULL)//栈非空
return S->data;//返回栈顶元素的值,栈顶指针不变
}
三、总结
以上为笔者对数据结构——栈的一些见解和分析,希望大家从中有所收获,
有技术不到位的地方,还请大佬们指正和批评,个人主页有对数据结构其他部分的分析,欢迎大家访问且共同学习!