数据结构~栈篇

基于数据结构(C语言)实现栈的基本操作和数值转换应用

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#include<limits.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status; //函数类型

typedef int Boolean;//布尔型 值为TRUE 或 FALSE

typedef int SElemType;//栈元素类型为整型 (数值转换)

//typedef char SElemType;//栈元素类型为字符型 (括号匹配)

/*******************栈的基本操作**********************/

#define STACK_INIT_SIZE 10 //初始分配量

#define STACKINCREMENT 2 //增量

typedef struct SqStack

{

SElemType * base;//栈底指针

SElemType * top;//栈顶指针

int stacksize;//当前存储空间

}SqStack;

Status InitStack(SqStack *S)

{ /* 构造一个空栈S */

  (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

  if(!(*S).base)

    exit(OVERFLOW); /* 存储分配失败 */

  (*S).top=(*S).base;

  (*S).stacksize=STACK_INIT_SIZE;

  return OK;

}

Status ClearStack(SqStack *S)

{ /* 把S置为空栈 */

  (*S).top=(*S).base;

  return OK;

}

Status StackEmpty(SqStack S)

{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */

  if(S.top==S.base)

    return TRUE;

  else

    return FALSE;

}

int StackLength(SqStack S)

{ /* 返回S的元素个数 */

  return S.top-S.base;

}

Status Push(SqStack *S,SElemType e)

{ /* 插入元素e为新的栈顶元素 */

  if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */

  {

    (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));

    if(!(*S).base)

      exit(OVERFLOW); /* 存储分配失败 */

    (*S).top=(*S).base+(*S).stacksize;

    (*S).stacksize+=STACKINCREMENT;

  }

  *((*S).top)++=e;

  return OK;

}

Status Pop(SqStack *S,SElemType *e)

{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */

  if((*S).top==(*S).base)

    return ERROR;

  *e=*--(*S).top;

  return OK;

}

void conversion()

{ /* 自定义数值转换实现  */

  SqStack s;

  unsigned n; /* 非负整数 */

  unsigned u;/* 目标进制 */

  SElemType e;

  InitStack(&s); /* 初始化栈 */

  printf("n(正整数) = ");

  scanf("%u",&n);

  printf("请输入想要转化的进制(例如 2,8,16进制)= ");

  scanf("%u",&u);

  while(n&&u) /* 当n&&u不等于0 */

  {

    Push(&s,n%u); /* 入栈n除以u的余数(u进制的低位) */

    n=n/u;

  }

  while(!StackEmpty(s)) /* 当栈不空 */

  {

    Pop(&s,&e); /* 弹出栈顶元素且赋值给e */

    if(e<=9)

      printf("%d",e); /* 输出e */

    else

      printf("%c",e+55);/* 化为16进制e-9+64 */

  }

  printf("\n");

}

main()

{

conversion();

}

/*

如有不足,多多指教。

(ง •̀_•́)ง

*/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,253评论 0 2
  • /** * @author huihut * @E-mail:huihut@outlook.com * @vers...
    刘帆_d384阅读 3,424评论 0 0
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,764评论 0 38
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,191评论 0 2
  • 年,是自己的年! 本宝宝是第一次经历从外地赶回家过年,好在今年放假异常的早,8号从杭州动车12小时回到重庆已经是晚...
    紫宜阅读 2,761评论 0 3

友情链接更多精彩内容