头歌顺序栈——课上练

#include <stdio.h>
#include<stdlib.h>
/*此处是顺序栈数据结构定义*/
typedef int DataType;
struct seqStack
{//有3个数据成员
    int MAXNUM;//用于记录顺序栈中能存放的最大元素个数的 整型 MAXNUM   
    int top;//用于存放顺序栈的栈顶位置,初始化为0或-1 均可  整型  curNum
    DataType* element;//用于存放顺序栈数据元素的连续空间的起始地址  
};

typedef struct seqStack* PseqStack;
//第一关
PseqStack createNullStack_seq(int m)
{//此处填写代码,创建一个空的顺序栈,能存放的最大元素个数为 m,栈顶top设置为0
 //若m=0,则返回NULL 

    PseqStack p = (PseqStack)malloc(sizeof(struct seqStack));
    if (m != 0)
    {
        p->element = (DataType*)malloc(m * sizeof(DataType));
        if (p->element)
        {
            p->top = 0;
            p->MAXNUM = m;
            return p;

        }
        else free(p);
    }

    return NULL;
}

//第二关
int isNullStack_seq(PseqStack L)
{
    //判断顺序栈是否为空,若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1
    if (L == NULL)
        return -1;
    else {
        if (L->top == 0)

            return 1;
        else
            return 0;

    }

}


//第三关 
int isFullStack_seq(PseqStack L)
{
    //判断顺序栈是否已满,若已满,返回值为1,否则返回值为0
    if (L->top >= L->MAXNUM)
        return 1;
    else
        return 0;
}


//第四关
int push_seq(PseqStack L, DataType x)
{//在顺序栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1
    if (L->top >= L->MAXNUM)
        return 0;
    else
    {
        L->top = L->top + 1;
        L->element[L->top] = x;
        return 1;
    }

}



//第五关
DataType pop_seq(PseqStack L)
{//弹栈并返回删除元素,若栈为空,则返回-1
    if (L->top == 0)
        return -1;
    else
    {
        int m = L->element[L->top];
        L->top = L->top - 1;
        return m;
    }
}

//第六关
DataType top_seq(PseqStack L)
{// 取栈顶元素返回,若栈为空,则返回-1
    if (L->top == 0)
        return -1;
    else
        return (L->element[L->top]);
}

//销毁顺序栈,释放栈所占存储空间
int destroystack_seq(PseqStack L)
{
    //返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0
    if (L != NULL)
    {
        int num = L->top + 1;
        L->MAXNUM = 0;
        free(L->element);
        return num;

    }
    return 0;

}

//第七关
//使用已实现的栈操作,实现数制转换

void print(PseqStack L)
{
    //逐个弹出栈L中的数据元素并输出,输出数据间不需要任何间隔符号
    while (L->top != 0)
    {
        printf("%d", pop_seq(L));
    }

}

void convert(int data, int k)
{
    //利用栈实现将data转换为k进制,k可能是2,8,16. 在本函数内实现转换并调用print函数输出转换后的结果
    //十六进制时输出 A ,B ,C, D,E,F 使用大写字母
    PseqStack L = createNullStack_seq(200);
    if (k == 2)
    {
        int m = data % 2;
        push_seq(L, m);
        int n = data / 2;
        while (n != 0)
        {
            m = n % 2;
            n = n / 2;
            push_seq(L, m);
        }
        print(L);
    }
    if (k == 8)
    {
        int m = data % 8;
        push_seq(L, m);
        int n = data / 8;
        while (n != 0)
        {
            m = n % 8;
            n = n / 8;
            push_seq(L, m);
        }
        print(L);

    }
    if (k == 16)
    {
        int m = data % 16; char c;
        if (m >= 10)
        {
            c = m - 10 + 'A';
        }
        push_seq(L, c);
        int n = data / 16;
        while (n != 0)
        {
            m = n % 16;
            n = n / 16;
            if (m >= 10)
            {
                c = m - 10 + 'A';
            }
            else
            {
                c = m + '0';
            }
            push_seq(L, c);
        }
        while (L->top != 0)
        {
            printf("%c", pop_seq(L));
        }

    }
}















 

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序栈是一种线性数据结构,它具有后进先出(LIFO)的特点。它基本的操作有初始化栈、进栈、出栈、获取栈顶元素和判断栈是否为空。 首先,初始化栈是创建一个空的栈结构,即创建一个存储数据的数组和一个表示栈顶位置的变量。进栈操作是将新的元素添加到栈顶,即将元素存储在栈顶位置,并将栈顶位置加一。出栈操作是从栈顶弹出一个元素,即将栈顶位置减一,并返回栈顶元素。获取栈顶元素操作可以返回栈顶位置对应的元素的值,不改变栈的结构。判断栈是否为空操作是检查栈是否为空,即判断栈顶位置是否指向-1。 顺序栈的应用有很多,其中一个典型的应用是后缀表达式的计算。后缀表达式是一种不需要括号的表达式表示方法,例如:4 5 + 3 * 表示中缀表达式 4 + 5 * 3。使用顺序栈可以方便地计算后缀表达式,从左到右扫描表达式,遇到数字则进栈,遇到操作符则从栈中弹出两个数字进行计算,计算结果再进栈,重复这个过程直到表达式结束,最后栈中剩下的数字即为计算结果。 另外,顺序栈还可以应用在函数调用过程中的保存现场和恢复现场操作。在函数调用时,可以使用顺序栈来保存调用函数执行到的位置、局部变量和其他相关信息。当函数执行完成后,可以从顺序栈中弹出保存的信息,恢复函数调用前的现场。 总的来说,顺序栈的基本操作包括初始化、进栈、出栈、获取栈顶元素和判断是否为空,其应用包括后缀表达式的计算和函数调用的现场保存和恢复。在编程中,顺序栈一个常用的数据结构,能够提供便利的操作和灵活的应用。在学习和实践中,我们可以通过参考csdn等资源,深入了解顺序栈的使用方法和注意事项,进一步提升自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值