栈
存取位置受限的线性表。插入和删除位置受限制,只能从栈顶插入和删除,形成了“先进后出”的现象。
顺序栈
特点
1、存储结构由一块连续的存储单元组成。
2、栈底为第一个元素a1的地址,为低地址。栈顶为最后一个元素的an的地址,为高地址。
结构体定义
typedef struct {
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stackSize;
}SqStack;
1、顺序栈在存储时,内存地址是连续的。所以这里采用的是通过两个指针来记录栈内元素位置。栈底指针base
在开辟连续地址时存储首地址位置,栈顶指针top
来记录当前栈内最后一个元素的下一个位置。
2、顺序栈是有固定长度的,所以在插入时进行栈满的判断。
入栈
int Push(SqStack &S,SElemType e){
//对栈满判断
if(S.top - S.base == S.stackSize){
return 1;
}
*S.top++ = e;//先将数据插入至S.top处,再将top增1
return 0;
}
出栈
int Pop(SqStack &S,SElemType &e){
//对栈空判断
if(S.top == S.base){
return 1;
}
e = *--S.top;//先将top减1,再取数值
return 0;
}
区分出栈和取栈顶元素的不同:出栈e = *--S.top
,取栈顶元素e = *(S.top-1)
。
链栈
特点
1、在物理存储中,存储空间并不连续。
2、链栈为了方便插入和删除操作的实现,没有头节点,那么判空条件就是S == NULL;
3、栈顶指针同时充当链表的头指针。
结构体定义
typedef struct StackNode{
SElemType data;
struct StackNde *next;
}StackNode,*LinkStack;
入栈
int Push(LinkStack &S,SElemType e){
//链栈不进行栈满判断,插入原理同链表的“头”插法
LinkStack p = new StackNode;
p->data = e;
p->next = S;
S = p;
return 0;
出栈
int Pop(LinkStack &S,SElemType &e){
LinkStack p = new StackNode;
p = S;
e = S->data;
S = S->next;
delete p;
return 0;
其他
进制转换
要求
将输入的十进制数字转换为二进制数字输出。
原理
将十进制数模2取余的结果顺序通过栈的特殊结构颠倒过来。
void conversion(){
LinkStack S;
int N = 0,e = 0;
InitStack(S);
scanf("%d",&N);
while(N != 0){
Push(S,N%2);
N = N/2;
}
while(!IsEmpty(S)){
Pop(S,e);
pritf("%d",e);
}
}
以上均为栈相关内容的个人理解,欢迎大家指正!谢谢!