限定仅在表尾进行插入或删除操作的线性表。对栈来说,表尾又称栈顶(top),表头又称为栈底(bottom)。不含元素的空表称为空栈。
如:栈S=(a1,a2,…,an),其中a1为栈底元素,an 为栈顶元素
栈是一种线性结构
对栈的操作按照“后进先出”的原则进行
非空栈中,读取栈顶元素,不影响栈中元素之间的关系
向栈中插入一个新的元素,新插入的元素为新的栈顶元素
非空栈中,删除栈顶元素,其直接前驱为新的栈顶元素
顺序栈
用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈顶指针为指向表尾的指针
链栈
利用链表存储栈中栈底到栈顶的数据元素,栈顶指针为链表头指针
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
在顺序栈中,栈底指针始终指向栈底位置,而在非空栈中,栈顶指针始终指向栈顶元素的下一个位置
S.base=(SElemType*)malloc(STACK_INIT_SIZE*
sizeof(SElemType));
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
S.base = (SElemType *) realloc ( S.base,
(S.stacksize + STACKINCREMENT) *sizeof (SElemType));
sizeof (SElemType));
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top = e;
S.top = S.top+1;
if (S.top != S.base) {
S.top = S.top-1;
*S.top = e;
}
typedef struct SNode{
SElemType data; //数据域
structLNode *next; //指针域
}SNode, *LinkStack;
链栈中进行入栈、出栈和取栈顶元素等基本操作时,相当于链表在头指针处进行相应操作
入栈:插入在链表中的第一个位置,头指针指向新插入的元素
出栈:删除链表的第一元素,头指针指向其后继
取栈顶:读取链表中第一个元素,头指针不变
原文地址:http://blog.csdn.net/gxseveryday/article/details/45622621