C语言实现栈的基本操作

C语言实现栈的基本操作(附二进制转十进制操作)

/*
 * @Author: xgh
 * @Date: 2020-06-17 21:34:45
 * @LastEditTime: 2020-06-20 10:17:52
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \VS-CODE-C\.vscode\Stack\stack.c
 */ 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define STACK_INIT_SIZE 100  // 栈容量
#define STACKINCREMENT 10  // 栈增加容量大小
#define ERROR 0
#define SUCCESS 1
#define OVER 0

typedef char ElemType;
typedef int Statue;

// 栈结构体
typedef struct sqStack
{
    ElemType *base;  // 栈底指针
    ElemType *top;   // 栈顶指针
    int stackSize;   // 栈大小
}sqStack;

Statue InitStack(sqStack *s);
Statue pushStack(sqStack *s, ElemType e);
Statue pullStack(sqStack *s, ElemType *pushdata);
void clearStack(sqStack *s);
Statue DestoryStack(sqStack *s);
int StackLen(sqStack *s);
int binaryToDec(sqStack *s);

int main(void){

    int i;
    sqStack *stack;
    sqStack *otcStack;
    char data[4] = {'0', '0', '1', '1'};

    InitStack(stack);
    InitStack(otcStack);

    printf("进栈顺序为:");
    for(i = 0; i < 4; i++){
        printf("%4c", data[i]);
        pushStack(stack, data[i]);
    }

    //scanf("%d", &i);

    printf("\n\n");

    printf("二进制转十进制数后为:%d", binaryToDec(stack)); 

    /* printf("当前栈内的数据个数为:%d\n\n", StackLen(stack));
    
    pullStack(stack);

    printf("\n");

    clearStack(stack);

    printf("当前栈内的数据个数为:%d\n\n", StackLen(stack));
    //DestoryStack(stack);

    printf("\n"); */

    return 0;
}

/**
 * @description: 栈的初始化
 * @param {sqStack *s: 栈结构体} 
 * @return: SUCCESS: 栈初始化成功
 */
Statue InitStack(sqStack *s){

    // 分配内存空间
    s->base = (ElemType *) malloc (STACK_INIT_SIZE * (sizeof(ElemType)));
    // 判断内存分配是否成功
    if( !(s->base) ){
        exit(ERROR);
    }

    // 栈置空
    s->top = s->base;
    // 将栈容量置为100
    s->stackSize = STACK_INIT_SIZE;

    return SUCCESS;
}

/**
 * @description: 进栈
 * @param {sqStack *s: 栈结构体} 
 * @param {ElemType e: 进栈数据}
 * @return: SUCCESS: 进栈成功
 */
Statue pushStack(sqStack *s, ElemType e){

    // 判断是否栈满, 栈满则分配新的空间
    if( s->top - s->base >= s->stackSize){

        // 增加新的内存容量
        s->base = (ElemType *) realloc (s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        // 判断内存是否分配成功
        if( !(s->base) ){
            exit(ERROR);
        }

        // 设置栈顶
        s->top = s->base + s->stackSize;
        // 设置新的容量
        s->stackSize += STACKINCREMENT;
    }

    // 设置进栈的数据
    *(s->top) = e;
    // 栈顶移动
    s->top++;

    return SUCCESS;
}

/**
 * @description: 出栈
 * @param {sqStack *s: 栈结构体} 
 * @return: OVER: 数据出栈结束
 * @return: SUCCESS: 出栈成功
 */
Statue pullStack(sqStack *s, ElemType *pushData){

    // 判断栈数据是否已全部出栈
    //while (s->top != s->base)
    //{
        --(s->top);
        *pushData = *(s->top);
    //}
   
    return SUCCESS;
}

/**
 * @description: 清空栈
 * @param {sqStack *s: 栈结构体} 
 * @return: NULL
 */
void clearStack(sqStack *s){
    s->top = s->base;
}

/**
 * @description: 销毁栈
 * @param {sqStack *s: 栈结构体} 
 * @return: SUCCESS: 销毁成功
 */
Statue DestoryStack(sqStack *s){

    int i, len;
    len = s->stackSize; // 获取栈大小

    for(i = 0; i < len; i++){
        // 释放空间
        free(s->base);
        // 栈底指针移动
        s->base++;
    }

    // 将栈顶、栈底指针置空
    s->base = s->top = NULL;
    // 栈大小清0
    s->stackSize = 0;

    return SUCCESS;
}

/**
 * @description: 获取当前栈的数据数量
 * @param {sqStack *s: 栈结构体}
 * @return: 栈中的数据数量
 */
int StackLen(sqStack *s){
    return(s->top - s->base);
}

/**
 * @description: 二进制数转十进制数
 * @param {sqStack *s: 栈结构体} 
 * @return: 转换后的十进制数
 */
int binaryToDec(sqStack *s){

    char data;
    int i, sum = 0;
    // 获取栈的元素个数
    int num = StackLen(s);
    
    for(i = 0; i < num; i++){
        // 元素出栈
        pullStack(s, &data);
        // 转换十进制数
        sum = sum + (data - 48) * pow(2, i);
    }

    return sum;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值