栈(Stack)是定义在线性结构上的抽象数据类型,其操作类似线性表操作,但元素的插入、删除和访问都必须在表的一端进行。
为形象起见,称允许操作端为栈顶(Top),另一端为栈底(base),注意Top指向待插入位置
Last In First Out后进先出//总是访问最近插入的一个//按插入顺序倒着访问。
应用:进制转换 括号匹配 迷宫求解
#include<iostream>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status
typedef int SElemType;
1、顺序存储结构定义
typedef struct{//栈顶指针 栈底指针 栈容量
SElemType *base;
SElemType *top;
int stacksize; //栈的容量
}SqStack;
2、初始化栈
Status InitStack(SqStack &S){
//分配空间
S.base=(SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
3、销毁栈
Status DestroyStack(SqStack &S){
//释放空间
free(S.base);
S.base=NULL;//防止内存泄露
S.top=NULL;
S.stacksize=0;
return OK;
}
4、清除栈
Status ClearStack(SqStack &S){
S.top=S.base;
return OK;
}
5、入栈
Status Push(SqStack&S,SElemType e){
if(S.stacksize==S.top-S.base){//栈满重新分配空间
S.base=(SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;//由于realloc,需要使top重新回到栈顶
S.stacksize+=STACKINCREMENT;
}
*S.top=e;
S.top++;
return OK;
}
6、出栈
Status Pop(SqStack&S,SElemType &e){
//判断栈是否为空
if(S.top==S.base) return ERROR;
S.top--;
e=*S.top;
return OK;
}
7、修改栈顶元素
Status SetTopElem(SqStack&S,ElemType e){
//将栈顶元素的值修改为e
if(S.top==S.base) return ERROR;
*(S.top-1)=e;
returnOK;
}
8、判断栈是否为空
Status StackEmpty(SqStack S){
if(S.top==S.base) return TRUE;
else return FALSE;
}
9、求栈长
int StackLength(SqStack S){
return S.top-S.base;
}
10、去栈顶元素
Status GetTop(SqStack S,SElemType &e){
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}
11、删除栈中元素
Status visit(SElemType e){
cout<<e<<" ";
return OK;
}
Status StackTraverse(SqStack S,Status (*visit)(SElemType))//将函数地址传入{
//从栈底元素到栈顶依次执行visit函数 常用于输出栈中元素
SElemType*p=S.base;
while(p<S.top){
if(visit(*p)==ERROR)return ERROR;
p++;
}
return OK;
}
}
若栈中元素的数目变化范围较大或不清楚栈元素的数目,可考虑使用链式存储结构。用链式存储结构表示的栈称作“链栈”。
链栈常用一个无头结点的单链表表示,栈名指针指向栈顶元素(尾元素),不同于顺序栈的栈顶,顺序栈顶指向第一个空位置
1、链式存储结构定义
typedef struct StackNode{
SElemType data;
struct SNode *next;
}SNode,*LinkStack;
2、初始化
Status InitStack|(LinkStack &S){
S=NULL;
}
3、栈顶插入元素
Status Push(LinkStatus &S,SElemType e){
//将元素e插入到栈的顶部
SNode*p;
p=(SNode*)malloc(sizeof(SNode));
if(!p) exit(OVERFLOW);
p>data=e;
p->next=S;
S=p;
return OK;
}
4、删除栈顶元素
Status Pop(LinkList &S,SElemType &e){
//删除栈顶元素并用e返回
if(!S) return ERROR;
e=S->data;
SNode*p=S;
S=S->next;
free(p);p=NULL;//防止内存泄露
return OK;
}

本文介绍了栈这一数据结构的基本概念,包括栈的定义、操作原理及其实现方式。详细讲解了顺序栈与链栈的创建、销毁、入栈、出栈等核心操作,并提供了具体的C++实现代码。
1464

被折叠的 条评论
为什么被折叠?



