该运算只适用于栈的顺序存储结构。
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。算法
#define STACK_INIT_SIZE 100; //存储空间初始化分配量 #define STACKINCREMENT 10; //存储空间分配的增量 typedef char SElemType; //假设数据元素师char型 typedef struct { SElemType * base; //底部指针 SElemType * top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack;
bool InitStack(SqStack * S) {//构造一个空栈S S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S->base) { exit(OVERFLOW); //存储分配失败 } S->top = S->base; //栈顶位置为栈底位置 S->stacksize = STACK_INIT_SIZE; return true; }(2)判断是否空栈
bool StackEmpty(SqStack * S) { if (S->base == S->top) { return true; } else return false; }(3)取栈顶元素
bool GetTop(SqStack * S, SElemType * e) {//若栈不空,则用e返回S的栈顶元素,并返回ture,不然返回false if (StackEmpty(S)) { return false; } else { e = *(S->top - 1); return true; } }(4)进栈
bool Push(SqStack * S, SElemType e) {//插入元素e为新的栈顶元素 if (S->top - S->base >= S->stacksize) {//若是栈满,追加存储空间 S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType)); if (!S->base) {//分配失败 exit(OVERFLOW); } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; //插入元素 return true; }(5)出栈
bool Pop(SqStack * S, SElemType * e) {//若栈不空,则删除S的栈顶元素,用e返回其值 if (StackEmpty(S)) { return false; } else { S->top--; e = *(S->top); return true; } }
栈的链式存储结构称为链栈。spa
链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
指针
typedef struct stackNode { SElemType data; struct stackNode * next; }stackNode; typedef struct stackqueue { stackNode * base, *top; }stackqueue;
(1)初始化空栈code
bool InitStack(stackqueue * S) { S->base = NULL;//初始化栈底指针 S->top = NULL;//初始化栈顶指针 }
bool StackEmpty(stackqueue * S) { return S->base == NULL; }
void Push(stackqueue * S, SElemType e) { stackNode *p = (stackNode *)malloc(sizeof(stackNode)); //先为新元素分配空间 p->data = e; p->next = NULL; if (StackEmpty(S)) {//若是是空栈 S->base = p; S->top = p; } else { S->top->next = p; S->top = p; } }(4)出栈
bool Pop(stackqueue * S, SElemType * e) { stackNode * p; if (StackEmpty(S)) { return false; } else { *e = S->top->data; if (S->base == S->top) {//若是只有一个元素,则置为空栈 S->base = NULL; S->top = NULL; } else {//找到指向原先栈顶的指针,将其置为栈顶 p = S->base; while(p->next != S->top) { p = p->next; } S->top = p; S->top->next = NULL; } } return true; }