zoukankan      html  css  js  c++  java
  • 19、链式栈

    Stack.h

     1 #ifndef STACK_H
     2 #define STACK_H
     3 
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<string.h>
     7 
     8 #define OK 1
     9 #define ERROR 0
    10 #define TRUE 1
    11 #define FALSE 0
    12 
    13 typedef int SElemType;
    14 typedef int Status;
    15 //初始化结构
    16 typedef struct StackNode{
    17     SElemType data;
    18     struct StackNode* next;
    19 }StackNode,*LinkStackPtr;
    20 
    21 typedef struct LinkStack {
    22     StackNode* top;
    23     int count;
    24 }LinkStack;
    25 
    26 
    27 //初始化操作,建立一个空栈
    28 LinkStack* InitStack();
    29 //将栈清空
    30 void ClearStack(LinkStack *s);
    31 //销毁
    32 void DestoryStack(LinkStack *s);
    33 //若栈为空,返回TRUE,否则返回false
    34 Status IsEmpty(LinkStack s);
    35 //若栈存在且非空,用e返回S的栈顶元素
    36 void GetTop(LinkStack s, SElemType *e);
    37 //插入元素e为新的栈顶元素
    38 Status Push(LinkStack *s, SElemType e);
    39 //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
    40 Status Pop(LinkStack *s, SElemType *e);
    41 //返回栈S的元素个数
    42 Status StackLength(LinkStack *s);
    43 
    44 //打印
    45 void PrintfStack(LinkStack *s);
    46 
    47 #endif

    Stack.c

     1 #include"Stack.h"
     2 
     3 //初始化操作,建立一个空栈
     4 LinkStack* InitStack() {
     5     LinkStack *s = (LinkStack*)malloc(sizeof(LinkStack));
     6     s->count = 0;
     7     s->top = (StackNode*)malloc(sizeof(StackNode));
     8     s->top->data = NULL;
     9     s->top->next = NULL;
    10     return s;
    11 }
    12 //将栈清空
    13 void ClearStack(LinkStack *s) {
    14 
    15 
    16 }
    17 //销毁
    18 void DestoryStack(LinkStack *s) {
    19     if (s == NULL) {
    20         return;
    21     }
    22     LinkStackPtr p;
    23     p = s->top;//将栈顶结点赋值给p
    24     while (p != NULL) {
    25         LinkStackPtr pNext = p->next;
    26         free(p);//释放结点p
    27         p = pNext;
    28     }
    29     s->count = 0;
    30     free(s);
    31 }
    32 //若栈为空,返回TRUE,否则返回false
    33 Status IsEmpty(LinkStack s) {
    34     if (s.top->next == NULL) {
    35         return TRUE;
    36     }
    37     return FALSE;
    38 }
    39 //若栈存在且非空,用e返回S的栈顶元素
    40 void GetTop(LinkStack s, SElemType *e) {
    41 
    42 
    43 }
    44 //插入元素e为新的栈顶元素
    45 Status Push(LinkStack *s, SElemType e) {
    46     LinkStackPtr a = (LinkStackPtr)malloc(sizeof(StackNode));
    47     a->data = e;
    48     a->next = s->top;//把当前的栈顶元素赋给新结点的直接后继
    49     s->top = a;//将新结点a赋值给栈顶指针
    50     s->count++;
    51     return OK;
    52 }
    53 //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
    54 Status Pop(LinkStack *s, SElemType *e) {
    55     StackNode* p;
    56     if (IsEmpty(*s)) {
    57         return ERROR;
    58     }
    59     *e = s->top->data;
    60     p = s->top;//将栈顶结点赋值给p
    61     printf("删除前s->top:%d
    ", s->top->data);
    62     s->top = p->next;//使得栈顶指针下移一位,指向后一结点
    63     free(p);//释放结点p
    64     printf("删除后结点释放后s->top:%d
    ",s->top->data);
    65     s->count--;
    66     return OK;
    67 }
    68 //返回栈S的元素个数
    69 Status StackLength(LinkStack *s) {
    70     
    71     int j = s->count;
    72     return j;
    73 }
    74 
    75 //打印
    76 void PrintfStack(LinkStack *s) {
    77     if (s == NULL) {
    78         return;
    79     }
    80     LinkStackPtr pCurrent = s->top;
    81     for (int i = 0; i < StackLength(s);i++) {
    82         printf("%d ",pCurrent->data);
    83         pCurrent = pCurrent->next;
    84     }
    85     printf("
    ");
    86 }

    main.c

     1 #define _CRT_SECURE_NO_WARNINGS
     2 
     3 #include<stdio.h>
     4 #include<stdlib.h>
     5 #include<string.h>
     6 #include"Stack.h"
     7 
     8 
     9 
    10 int main()
    11 {
    12     int m[] = { 13,24,45,46,68,78,98 };
    13     int n = 7;
    14     //初始化
    15     LinkStack* b = InitStack();
    16     SElemType e;
    17     printf("栈的长度为:%d 
    ", StackLength(b));
    18     //入栈
    19     for (int i = 0; i < n; i++) {
    20         Push(b, m[i]);
    21     }
    22     //打印
    23     printf("栈的长度为:%d 
    ", StackLength(b));
    24     PrintfStack(b);
    25 
    26     //出栈
    27     Pop(b, &e);
    28 
    29     //打印
    30     printf("栈的长度为:%d 
    ", StackLength(b));
    31     PrintfStack(b);
    32 
    33     //释放
    34     DestoryStack(b);
    35 
    36 
    37 
    38     printf("
    ");
    39     system("pause");
    40     return 0;
    41 }

    VS2015运行结果:

  • 相关阅读:
    Yield Usage Understanding
    Deadclock on calling async methond
    How to generate file name according to datetime in bat command
    Run Unit API Testing Which Was Distributed To Multiple Test Agents
    druid的关键参数+数据库连接池运行原理
    修改idea打开新窗口的默认配置
    spring boot -thymeleaf-url
    @pathvariable和@RequestParam的区别
    spring boot -thymeleaf-域对象操作
    spring boot -thymeleaf-遍历list和map
  • 原文地址:https://www.cnblogs.com/luanxin/p/8995950.html
Copyright © 2011-2022 走看看