链栈的出栈操作

其实就是删除结点而已
服务器君一共花费了411.581 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

前面讨论了链栈的进栈操作,这里接下来讨论链栈的出栈操作。

  • 至于链栈的出栈pop操作,也是很简单的三句操作。假设变量p用来存储要删除 的栈顶结点,将栈顶指针下移一位,最后释放p即可。

详细的算法步骤:

  1. 首先设定一个工作结点 p,并且将栈顶结点赋值给它。
  2. 然后将栈顶指针下移一位,指向下一结点。代码表示为 S->top=S->top->next;
  3. 最后把结点 p free掉,count自减1,完成。

链栈出栈函数设计为:

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S))
        return ERROR;
    *e=S->top->data;
    p=S->top;					/* 将栈顶结点赋值给p,见图中① */
    S->top=S->top->next;    /* 使得栈顶指针下移一位,指向后一结点,见图中② */
    free(p);                    /* 释放结点p */
    S->count--;
    return OK;
}
  • 函数中用到一个函数 StackEmpty(*S) 来判断栈是否为空,这个功能函数很简单,后面也会介绍到。

完整的可执行代码为:

#include "stdio.h"
#include "stdlib.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;
/* SElemType类型根据实际情况而定,这里假设为int */
typedef int SElemType;

/* 链栈结构 */
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
} StackNode,*LinkStackPtr;

typedef struct
{
    LinkStackPtr top;
    int count;
} LinkStack;

/*  构造一个空栈S */
Status InitStack(LinkStack *S)
{
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if(!S->top)
        return ERROR;
    S->top=NULL;
    S->count=0;
    return OK;
}

Status StackTraverse(LinkStack S)
{
    LinkStackPtr p;
    p=S.top;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

Status visit(SElemType c)
{
    printf("%d ",c);
    return OK;
}

/* 插入元素e为新的栈顶元素 */
Status Push(LinkStack *S,SElemType e)
{
    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
    s->data=e;
    s->next=S->top;	/* 把当前的栈顶元素赋值给新结点的直接后继,见图中① */
    S->top=s;         /* 将新的结点s赋值给栈顶指针,见图中② */
    S->count++;
    return OK;
}

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S))
        return ERROR;
    *e=S->top->data;
    p=S->top;					/* 将栈顶结点赋值给p,见图中③ */
    S->top=S->top->next;    /* 使得栈顶指针下移一位,指向后一结点,见图中④ */
    free(p);                    /* 释放结点p */
    S->count--;
    return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(LinkStack S)
{
    if (S.count==0)
        return TRUE;
    else
        return FALSE;
}

int main()
{
    LinkStack s;
    int opp;
    int j, value, e;

    if(InitStack(&s)==OK)
    {
        printf("链栈初始化成功。");
    }

    printf("\n1.随机给栈赋值 \n2.栈遍历 \n3.进栈 \n4.出栈");
    printf("\n0.退出 \n请选择你的操作:\n");
    while(opp != '0')
    {
        scanf("%d",&opp);
        switch(opp)
        {
        case 1:
            srand(time(0));
            for(j=1; j<=10; j++)
            {
                Push(&s,rand()%100+1);
            }
            StackTraverse(s);
            break;

        case 2:
            StackTraverse(s);
            break;

        case 3:
            printf("请输入需要进栈的元素:");
            scanf("%d", &value);
            Push(&s, value);
            StackTraverse(s);
            break;

        case 4:
            Pop(&s,&e);
            printf("弹出的栈顶元素 e=%d\n",e);
            StackTraverse(s);
            break;

        case 0:
            exit(0);
        }
    }
    return 0;
}

延伸阅读

此文章所在专题列表如下:

  1. 栈的定义与大概理解
  2. 栈的抽象数据类型ADT
  3. 顺序栈:栈的顺序存储结构
  4. 顺序栈的进栈操作
  5. 顺序栈的出栈操作
  6. 获取顺序栈的栈顶元素
  7. 链栈:栈的链式存储结构
  8. 链栈的进栈操作
  9. 链栈的初始化与遍历
  10. 链栈的出栈操作
  11. 链栈的置空操作与判断链栈是否为空
  12. 为什么要使用栈这种数据结构
  13. 递归,栈的重要应用之一
  14. 栈是如何实现递归的
  15. 接触后缀表达式(逆波兰表示法)
  16. 图解后缀表达式的计算过程
  17. 将中缀表达式转化为后缀表达式
  18. 开始学习队列这个数据结构
  19. 队列的抽象数据类型ADT
  20. 顺序队列:队列的顺序存储结构
  21. 顺序队列的入队操作
  22. 顺序队列的出队操作
  23. 顺序队列置空与判断操作
  24. 队列顺序存储结构的不足
  25. 关于循环队列的一些讲解
  26. 链队列:队列的链式存储结构
  27. 链队列的初始化操作
  28. 链队列的入队操作
  29. 链队列的出队操作
  30. 补完链队列的其它常见操作
  31. 循环队列与链队列的优劣势

本文地址:http://www.nowamagic.net/librarys/veda/detail/2293,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2293

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《UNIX编程艺术》 姜宏 (作者)

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为本书贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。

更多计算机宝库...