• 栈 —— 链式存储


    链栈:

    链栈结构的定义:

    链栈即栈的链式存储,这里用带头结点的单链表实现链栈

    1 typedef int StackElemType;
    2 typedef struct node {
    3     StackElemType data;
    4     struct node* next;
    5 }LinkStackNode,*LinkStack;

    链栈初始化:

    1 /*初始化链栈*/
    2 LinkStack initLinkStack() {
    3     LinkStack ls = (LinkStackNode*)malloc(sizeof(LinkStackNode));
    4     ls->next = NULL;
    5     return ls;
    6 }

    链栈进栈操作

     1 /*链栈压入元素*/
     2 int push(LinkStack top,StackElemType e) {
     3     LinkStackNode* temp = (LinkStackNode*)malloc(sizeof(LinkStackNode));
     4     /*判断申请空间是否成功*/
     5     if (temp==NULL)
     6     {
     7         return false;
     8     }
     9     //将元素e存入到结点
    10     temp->data = e; 
    11     //将结点存入到链栈中
    12     temp->next = top->next;
    13     top->next = temp;
    14     return true;
    15 }

    链栈出栈操作:

     1 /*链栈弹出元素*/
     2 int pop(LinkStack top,StackElemType *e) {
     3     LinkStackNode* temp;
     4     temp = top->next;
     5     /*判断链栈是否为空*/
     6     if (temp==NULL)
     7     {
     8         return false;
     9     }
    10     //存储删除的元素
    11     *e = temp->data;
    12     //元素出栈,栈顶指向出栈元素的下一个结点
    13     top->next = temp->next;
    14     /*释放存储空间*/
    15     free(temp);
    16     return true;
    17 }

    获取栈顶元素:

    1 /*获取栈顶元素*/
    2 StackElemType getStackTop(LinkStack top) {
    3     //判断栈是否为空
    4     if (top->next == NULL) {
    5         return false;
    6     }
    7     return (top->next->data);
    8 }

    置空链栈:

     1 /*置空栈*/
     2 void setStackNULL(LinkStack top) {
     3     LinkStackNode* s, * p;
     4     p = top->next;
     5     while (p!=NULL)
     6     {
     7         s = p;
     8         free(s);
     9         p = p->next;
    10     }
    11     top->next = NULL;
    12 }

    打印链栈内的元素:

     1 /*打印链栈内的元素*/
     2 void printfListStack(LinkStack top) {
     3     LinkStackNode* p;
     4     p = top->next;
     5     while (p != NULL) {
     6         printf("%d ", p->data);
     7         p = p->next;
     8     }
     9     printf("\n");
    10 }

    主函数:

     1 int main() {
     2     LinkStack ls = initLinkStack();
     3     StackElemType e;
     4     push(ls, 2);
     5     push(ls, 4);
     6     push(ls, 6);
     7     printf("进栈元素:");
     8     printfListStack(ls);
     9 
    10     int num = getStackTop(ls);
    11     printf("获取栈顶元素:%d \n", num);
    12 
    13     pop(ls, &e);
    14     printf("出栈的元素:%d\n", e);
    15     printf("栈内元素:");
    16     printfListStack(ls);
    17 
    18     printf("置空链栈:");
    19     setStackNULL(ls);
    20     printfListStack(ls);
    21 
    22     return 0;
    23 }

  • 相关阅读:
    Java设计模式-----装饰模式
    Java并发包中Lock的实现原理
    ThreadLocal,静态变量,实例变量,局部变量的线程安全
    ThreadLocal类详解
    SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别
    Wireshark 、HTTPWatch、Fiddler的介绍
    TCP/IP、HTTP、Socket的区别
    我希望你并不幸福
    Autoregressive Convolutional Neural Networks for Asynchronous Time Series
    DRL Lecture1:Policy Gradient
  • 原文地址:https://www.cnblogs.com/chaunceyji/p/13960650.html
Copyright © 2020-2023  润新知