c语言 -- 数据结构 -- 用链表实现栈

栈的链式结构

这里写图片描述

链表节点

typedef struct node {
    char c;                             // 数据
    struct node *next;                  // 指针
}node, *pt;

栈顶指针

typedef struct stack {
    pt top;                            // 指向栈顶
    int count;                         // 可用来记录栈的大小
}stack;

入栈操作

这里写图片描述

void in (char c, stack * p)          // c为数据, *p为栈顶指针的指针,用来改变栈顶指针的值
{
    pt current;
    current = (pt) malloc (sizeof(node));    // 新建节点
    current->next = (*p).top;                // 新建的节点指向上一个新建的节点
    current->c = c;                          // 数据赋值
    (*p).top = current;                      // 改变站顶指针,使其指向新建的节点。
    (*p).count++;                            // 栈长度计数自增
}

出栈操作

这里写图片描述

void out (char * c, stack * p)         // 将c的指针传入,用来传递出栈的值。将栈顶指针的指针传入。
{
    pt prev;                          
    prev = (*p).top;                    // 先记录下要出栈释放的节点。

    if ((*p).top->next == NULL)         // 如果栈为空栈则返回空格
    {
        *c = 32;
        return ;                        // 空栈则跳出函数
    }
        *c = (*p).top->c;                   // 值传递,将出栈的值传出。
    (*p).top = (*p).top->next;          // 栈顶指向栈的上个节点
    (*p).count--;                       // 计数器自减
    free(prev) ;                        // 释放出栈的节点
}

遍历栈并输出

这里写图片描述

void print(stack p)                              
{
    pt current = (*p).top;                      // 指向栈顶的节点
    while (current != NULL)
    {
        putchar(current->c) ;      
        current = current->next;
    } 
    printf("\n");
}

具体测试

#include<stdio.h>
#include<stdlib.h>
typedef struct node {
    char c;
    struct node *next;
}node, *pt;

typedef struct stack {
    pt top;
    int count;
}stack;

void creat (stack * p);
void in (char c, stack * p);
void out (char * c, stack * p);
void print( stack p);

int main ()
{
    char c;
    stack p;
    creat(&p);
    while(scanf("%c", &c) != EOF)
    {
        getchar();
        in(c, &p);
    }
    print(p);
        while(1)
    { 
        getchar();
        out(&c, &p);
        if (c == 32) break;
        printf("出栈%c\n", c);
        print(p);
    }

}

void creat (stack * p)
{
    (*p).top = NULL;
    (*p).count = 0;
}

void in (char c, stack * p)
{
    pt current;
    current = (pt) malloc (sizeof(node));
    current->next = (*p).top;
    current->c = c;
    (*p).top = current;
    (*p).count++;
}

void out (char * c, stack * p)
{
    pt prev; 
    prev = (*p).top; 
    *c = (*p).top->c;
    if ((*p).top->next == NULL)
    {
        *c = 32;
        return ;
    }
    (*p).top = (*p).top->next;
    (*p).count--;
    free(prev) ; 
}

void print(stack  p)
{
    pt current = p.top;
    while (current != NULL)
    {
        putchar(current->c) ;
        current = current->next;
    } 
    printf("\n");
}

测试结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/z944733142/article/details/80573628