堆栈
1.2堆栈(Stack)及实现
1.2.1堆栈的定义
具有一定操作约束的线性表,只在一端(栈顶top)做插入(push)、删除(pop),后进先出(LIFO)。
1.2.2栈的存储实现
1.2.2.1栈的顺序存储实现
通常由一个一维数组和一个记录栈顶元素位置的变量组成。
1 #define MaxSize 100//堆栈元素的最大个数 2 typedef int ElementType; 3 typedef struct SNode* Stack; 4 struct SNode 5 { 6 ElementType Data[MaxSize];//存储堆栈元素 7 int top;//记录栈顶元素的下标 8 }; 9 Stack S; 10 11 //初始化 12 Stack CreatStack() { 13 S = (Stack)malloc(sizeof(SNode)); 14 S->top = -1;//说明堆栈中从0下标开始都没有存储数据 15 return S; 16 } 17 18 //是否已满 19 int IsFull(Stack S) { 20 return (S->top == MaxSize - 1); 21 } 22 23 //是否空 24 int IsEmpty(Stack S) { 25 return (S->top == -1); 26 } 27 28 //入栈 29 void Push(Stack S, ElementType item) { 30 if (iSFull(S)) { 31 printf("栈已满"); 32 return; 33 } 34 S->top++;//栈顶元素先加1 35 S->Data[S->top] = item;//栈顶指向的位置存放item 36 return; 37 } 38 39 //出栈 同时返回栈顶元素 40 ElementType Pop(Stack S){ 41 if (IsEmpty(S)) { 42 printf("栈已空"); 43 return 0; 44 } 45 ElementType val = S->Data[S->top]; 46 S->top--;//先取出再释放位置 47 return val; 48 }
1.2.2.2栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在栈顶进行。
typedef int ElementType; typedef struct SNode* Stack; struct SNode { ElementType Data; Stack Next;//指向下一个结点 }; Stack S; //初始化 Stack CreateStack() { Stack S; S = (Stack)malloc(sizeof(SNode)); S->Next = NULL;//建立一个头结点 return S; } //判断是否为空 int IsEmpty(Stack S) { return (S->Next == NULL); } //入栈 void Push(Stack S, ElementType item) { Stack tmp;//建立一个结点,将结点插入链表 tmp = (Stack)malloc(sizeof(SNode)); tmp->Data = item;//将元素值存入结点的数据域 //链栈栈顶元素是链表头结点,新入栈的结点在栈顶元素后面 //相当于新入栈的元素总是插在链表的第二个位置上 tmp->Next = S->Next; S->Next = tmp; } //出栈 ElementType Pop(Stack S) { Stack First;//出栈的结点 ElementType TopVal;//出栈的结点的数据域 if (IsEmpty(S)) { printf("栈已空"); return 0; } First = S->Next;//指向待删除的结点 S->Next = First->Next; TopVal = First->Data; free(First); return TopVal; }
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。