顺序栈
顺序栈表示
typedef struct{
//栈底
elemtype *base;
//栈顶
elemtype *top;
int stacksize;
}Stack;
简单表示一个顺序栈,base指针指着栈底,然后top指针指着栈顶元素的下一位置的地址,这样设置是为了方便操作栈顶元素。
顺序栈元素个数
数组表示的顺序栈里,可以用top-base,两个指针之差求得中间元素个数
顺序栈的初始化
elemtype是栈元素,数据类型自行定义
int InitStack(Stack &S){
S.base=new elemtype[maxsize];
if(!S.base){
//指针创建失败
return ERROR;
}
S.top=S.base;
S.stacksize=maxsize;
return OK;
}
栈的容量
栈空:top==base
栈满:top-base=stacksize
栈的操作
清空:若base存在,将top指针调整至与base指针指向同一位置,栈为空
销毁:释放栈底,将stacksize设置为0,top和base均设置为空指针
入栈
int InitStack(Stack &S){
S.base=new elemtype[maxsize];
if(!S.base){
//指针创建失败
return ERROR;
}
S.top=S.base;
S.stacksize=maxsize;
return OK;
}
出栈
int Pop(Stack &S,elemtype &e){
//判断栈是否空
if(S.top==S.base){
return ERROR;
}
S.top--;
e=*S.top;
return OK;
}
链栈
链栈是运算受限制的单链表,只能在链表头部进行操作
链栈没有头结点,头指针直接指向栈顶,空栈相当于头指针指向空,栈基本不会满,可以灵活扩大
栈的操纵
链栈的操作和单链表的类似,看起来神似一个指针方向倒过来的单链表
栈的初始化
typedef struct StackNode{
elemtype data;
struct StackNode *next;
}StackNode,*LinkStack;
LinkStack S;
int InitStack(LinkStack &S){
//创造一个空的栈,头指针为空
S=NULL;
return OK;
}
入栈
int Push(LinkStack &S,elemtype){
//创建一个新节点
StackNode *p=new StackNode;
//初始化节点
p->data=e;
p-next=S;
//修改栈顶指针
S=p;
return OK;
}
出栈
int Pop(LinkStack &S,elemtype &e){
if(S==NULL){
return ERROR;
}
e=S->data;
StackNode p=S;
//修改栈顶指针
S=S->next;
//释放节点
delete p;
return OK;
}