数据结构--栈

一个栈

 

复制代码
//
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#define STACK_INIT_SIZE  20
#define STACK_INCREMENT  10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stacksize;
}sqStack;

void initStack(sqStack *s)
{
    //内存中开辟一段连续空间作为栈空间,首地址赋值给 s->base 
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!s->base) exit(0);   //分配空间失败
    s->top = s->base;  //最开始,栈顶就是栈底
    s->stacksize = STACK_INIT_SIZE;
}

void Push(sqStack* s, ElemType e)
{
    /////栈满,追加空间
    if (s->top - s->base >= s->stacksize)
    {
        s->base = (ElemType *)realloc(s->base, (s->stacksize + STACK_INCREMENT)*sizeof(ElemType));

        if (!s->base)
        {
            exit(0); //内存分配失败
        }
        s->top = s->base + s->stacksize;
        s->stacksize = s->stacksize + STACK_INCREMENT;//设置栈的最大容量
    }
    *(s->top) = e; //放入数据 
    s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
    if (s->top == s->base)
    {
        return;
    }
    *e = *--(s->top);
}

int StackLen(sqStack s)
{
    return (s.top - s.base);
}

void DestoryStack(sqStack* s)
{
    free(s->base);  //释放内存空间
    s->base = s->top = nullptr;//栈底栈顶指针置为nullptr 
    s->stacksize = 0;//设置栈的最大容量为0
}

void main()
{
    printf("Hello world!\r\n");

    ElemType c;
    sqStack s;
    int len, i, sum = 0;

    printf("Please input a Binary digit.\r\n");

    initStack(&s);//创建一个栈来存放二进制字符串
    ///输入 0/1 字符表示的二进制数,以#结束
    scanf("%c", &c);
    while (c != '#')
    {
        Push(&s, c);
        scanf("%c", &c);
    }
    getchar();
    len = StackLen(s);

    for (i = 0; i < len; i++)
    {
        Pop(&s, &c);
        sum = sum + (c - 48)*pow(2, i);  //转为十进制
    }
    printf("Decimal is %d.\r\n", sum);
    DestoryStack(&s);

    getchar();
}

///input:   10010101#
///output:  149 
复制代码

 

posted @   He_LiangLiang  阅读(186)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2013-04-03 STL学习笔记-- vector
2013-04-03 STL学习笔记--前篇
点击右上角即可分享
微信分享提示