堆栈

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;
}

 

posted @ 2020-03-29 10:12  PennyXia  阅读(260)  评论(0编辑  收藏  举报