获取顺序栈的栈顶元素

判断栈是否为空与置空栈
服务器君一共花费了299.375 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
  • 根据前面定义的栈ADT,我们还有几个操作要完成。比如获取顺序栈的栈顶元素 GetTop (S,*e):若栈存在且非空,用e返回S的栈顶元素
  • 这个操作的函数设计思路如何呢?参考之前线性表的话,就是设一个存储栈顶的变量 e,然后通过地址传递,用 *e 来保存指针为 top 的数组元素。

函数的设计如下:

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(SqStack S,SElemType *e)
{
    if (S.top==-1)
        return ERROR;
    else
        *e=S.data[S.top];
    return OK;
}
  • 顺序栈蛮简单,顺便把判断栈是否为空,还有置空栈的操作也完成吧。

判断栈是否为

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack S)
{
    if (S.top==-1)
        return TRUE;
    else
        return FALSE;
}

置空栈:

/* 把S置为空栈 */
Status ClearStack(SqStack *S)
{
    S->top=-1;
    return OK;
}

完整的可执行程序如下:

#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
{
    SElemType data[MAXSIZE];
    int top; /* 用于栈顶指针 */
}SqStack;

/*  构造一个空栈S */
Status InitStack(SqStack *S)
{
    /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
    S->top=-1;
    return OK;
}

/* 从栈底到栈顶依次对栈中每个元素显示 */
Status StackTraverse(SqStack S)
{
    int i;
    i=0;
    while(i<=S.top)
    {
        visit(S.data[i++]);
    }
    printf("\n");
    return OK;
}

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

/* 插入元素e为新的栈顶元素 */
Status Push(SqStack *S,SElemType e)
{
    if(S->top == MAXSIZE -1) /* 栈满 */
    {
        return ERROR;
    }
    S->top++;				/* 栈顶指针增加一 */
    S->data[S->top]=e;  /* 将新插入元素赋值给栈顶空间 */
    return OK;
}

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(SqStack *S,SElemType *e)
{
    if(S->top==-1)
        return ERROR;
    *e=S->data[S->top];	/* 将要删除的栈顶元素赋值给e */
    S->top--;				/* 栈顶指针减一 */
    return OK;
}

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(SqStack S,SElemType *e)
{
    if (S.top==-1)
        return ERROR;
    else
        *e=S.data[S.top];
    return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack S)
{
    if (S.top==-1)
        return TRUE;
    else
        return FALSE;
}

/* 把S置为空栈 */
Status ClearStack(SqStack *S)
{
    S->top=-1;
    return OK;
}

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

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

    printf("\n1.随机给栈赋值 \n2.栈遍历 \n3.进栈 \n4.出栈");
    printf("\n5.获取栈顶元素 \n6.判断栈是否为空 \n7.将栈置空");
    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 5:
                GetTop(s,&e);
                printf("栈顶元素 e=%d\n",e);
                break;

            case 6:
                printf("栈是否为空:%d(1:空 0:否)\n",StackEmpty(s));
                break;

            case 7:
                ClearStack(&s);
                printf("清空栈后,栈是否为空:%d(1:空 0:否)\n",StackEmpty(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/2276,欢迎访问原出处。

不打个分吗?

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

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

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

大家都在看

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

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

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

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

《深入理解MySQL核心技术》 Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)

《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。

更多计算机宝库...