栈是在链表的基础上删去一些功能,其本质仍是链表(程序"栈")
更为准确的说栈的定义很广泛,“倒水的杯子”,“盛放物品的箱子”....均满足“后进先出”。栈的相关应用有“括号配对问题”,链接: http://blog.csdn.net/u013806814/article/details/38593091
“火车进站问题”,链接:http://blog.csdn.net/u013806814/article/details/38636407
——参考《郝斌数据结构自学视频》、《数据结构C语言版》
ADT{
基本操作:
InitStack(&S)
操作结果:构造一个空栈S。
ClearStack(&S)
初始条件:栈S已存在。
操作结果:将S清为空栈。
Push(&S,e)栈S已存在。
初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:栈S已存在且非空。
操作结果删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
初始条件:栈S已存在且非空。
操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit().
一旦visit()失败,则操作失败。
}ADT Stack
/*
目的:构造一个栈InitStack();
作用:可完成Push(压栈)、Pop(出栈)、StackTraverse(遍历栈)、StackEmpty(判断栈空)的操作。
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node{
int date;
struct Node *next;
}NODE, *PNODE;
typedef struct Stack{
PNODE top;
PNODE base;
}STACK, *PSTACK;
/********栈的初始化******/
void InitStack(PSTACK pS){
pS->top = (PNODE)malloc(sizeof(NODE));
if(NULL == pS->top){
printf("内存分配失败!\n");
exit(-1);
}
else{
pS->base = pS->top;
pS->top->next = NULL;
}
}
/***********栈空**************/
int StackEmpty(PSTACK pS){
if(pS->base == pS->top){
return 1;
}
else return 0;
}
/************压栈*************/
void Push(PSTACK pS, int val){
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->date = val;
pNew->next = pS->top;
pS->top = pNew;
}
/*************遍历*************/
void StackTraverse(PSTACK pS){
PNODE p = pS->top;
while(p != pS->base){
printf("%d ",p->date);
p = p->next;
}
printf("\n");
return ;
}
/**************出栈***********/
bool Pop(PSTACK pS, int *pVal){
if(StackEmpty(pS)){
return 0;
}
else{
PNODE r = pS -> top;
*pVal = r -> date;
pS -> top = r -> next;
free(r);
r = NULL;
return 1;
}
}
/***********清空栈*************/
int ClearStack(PSTACK pS){
if(StackEmpty(pS)){
return 1;
}
else{
PNODE p = pS->top;
PNODE q;
while(p != pS->base){
q = p->next;
free(p);
p = q;
}
pS->base = pS->top;
return 1;
}
return 0;
}
int main(){
int val;
STACK S;
InitStack(&S);
Push(&S,1);
Push(&S,2);
Push(&S,3);
Push(&S,4);
Push(&S,5);
StackTraverse(&S);
if(Pop(&S,&val)){
printf("出栈成功,出栈元素是%d\n",val);
}
else{
printf("栈空,出栈失败\n!");
}
if(ClearStack(&S)){ //为了显示清空操作
printf("清空成功!\n");
}
StackTraverse(&S);
return 0;
}