当前位置:   article > 正文

栈的应用实例--数制转换(第三章 P48 算法3.1)_栈的案例举例---数制转换

栈的案例举例---数制转换

栈的应用实例--数制转换

 

题目:

假设现在要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。

 

解析:

先来看一个例子:十进制转二进制

1)十进制数156,转为二进制的结果是10011100,转换过程如下:

  1. 156除以2,商为78,余数为0;
  2. 78除以2,商为39,余数为0;
  3. 39除以2,商为19,余数为1;
  4. 19除以2,商为9,余数为1;
  5. 9除以2,商为4,余数为1;
  6. 4除以2,商为2,余数为0;
  7. 2除以2,商为1,余数为0;
  8. 1除以2,商为0,余数为1;
  9. 综上,将余数倒序排列,得10011100 。

由上,我们很容易看出进制转换的过程。

 

由于上述计算过程从低位到高位顺序产生的八进制数的各个数位,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反。因此,需要将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数。

 

 

十进制整数转换为八进制

  1. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  2. typedef int Boolean; /* Boolean是布尔类型,其值是TRUEFALSE */
  3. typedef int SElemType; /* 定义栈元素的类型 */
  4. #include<malloc.h> /* malloc()等 */
  5. #include<stdio.h> /* EOF(=^Z或F6),NULL */
  6. #include<process.h> /* exit() */
  7. /* 函数结果状态代码 */
  8. #define TRUE 1
  9. #define FALSE 0
  10. #define OK 1
  11. #define ERROR 0
  12. #define INFEASIBLE -1
  13. #define OVERFLOW -2
  14. /* -------------------------- 栈的顺序存储表示 -----------------------------*/
  15. #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
  16. #define STACKINCREMENT 2 /* 存储空间分配增量 */
  17. typedef struct SqStack
  18. {
  19. SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
  20. SElemType *top; /* 栈顶指针 */
  21. int stacksize; /* 当前已分配的存储空间,以元素为单位 */
  22. }SqStack; /* 顺序栈 */
  23. /* ----------------------------------------------------------------------------*/
  24. Status visit(SElemType c)
  25. {
  26. printf("%d ", c);
  27. return OK;
  28. }
  29. /* --------------------------------- 需要用到的顺序栈基本操作 ------------------------------------*/
  30. Status InitStack(SqStack *S)
  31. { /* 构造一个空栈S */
  32. (*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
  33. if (!(*S).base)
  34. exit(OVERFLOW); /* 存储分配失败 */
  35. (*S).top = (*S).base;
  36. (*S).stacksize = STACK_INIT_SIZE;
  37. return OK;
  38. }
  39. Status StackEmpty(SqStack S)
  40. { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
  41. if (S.top == S.base)
  42. return TRUE;
  43. else
  44. return FALSE;
  45. }
  46. Status Push(SqStack *S, SElemType e)
  47. { /* 插入元素e为新的栈顶元素 */
  48. if ((*S).top - (*S).base >= (*S).stacksize) /* 栈满,追加存储空间 */
  49. {
  50. (*S).base = (SElemType *)realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
  51. if (!(*S).base)
  52. exit(OVERFLOW); /* 存储分配失败 */
  53. (*S).top = (*S).base + (*S).stacksize;
  54. (*S).stacksize += STACKINCREMENT;
  55. }
  56. *((*S).top)++ = e;
  57. return OK;
  58. }
  59. Status Pop(SqStack *S, SElemType *e)
  60. { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
  61. if ((*S).top == (*S).base)
  62. return ERROR;
  63. *e = *--(*S).top;
  64. return OK;
  65. }
  66. /* -------------------------------------------------------------------------------------------------*/
  67. void conversion() /* 算法3.1 */
  68. { /* 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 */
  69. SqStack s;
  70. unsigned n; /* 非负整数 */
  71. SElemType e;
  72. InitStack(&s); /* 初始化栈 */
  73. printf("n(>=0)=");
  74. scanf_s("%u", &n); /* 输入非负十进制整数n */
  75. while (n) /* 当n不等于0 */
  76. {
  77. Push(&s, n % 8); /* 入栈n除以8的余数(8进制的低位) */
  78. n = n / 8;
  79. }
  80. while (!StackEmpty(s)) /* 当栈不空 */
  81. {
  82. Pop(&s, &e); /* 弹出栈顶元素且赋值给e */
  83. printf("%d", e); /* 输出e */
  84. }
  85. printf("\n");
  86. }
  87. void main()
  88. {
  89. conversion();
  90. }

 

运行结果:

 

 

 

 

十进制整数转换为八进制

  1. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  2. typedef int Boolean; /* Boolean是布尔类型,其值是TRUEFALSE */
  3. typedef int SElemType; /* 定义栈元素的类型 */
  4. #include<malloc.h> /* malloc()等 */
  5. #include<stdio.h> /* EOF(=^Z或F6),NULL */
  6. #include<process.h> /* exit() */
  7. /* 函数结果状态代码 */
  8. #define TRUE 1
  9. #define FALSE 0
  10. #define OK 1
  11. #define ERROR 0
  12. #define INFEASIBLE -1
  13. #define OVERFLOW -2
  14. /* -------------------------- 栈的顺序存储表示 -----------------------------*/
  15. #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
  16. #define STACKINCREMENT 2 /* 存储空间分配增量 */
  17. typedef struct SqStack
  18. {
  19. SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
  20. SElemType *top; /* 栈顶指针 */
  21. int stacksize; /* 当前已分配的存储空间,以元素为单位 */
  22. }SqStack; /* 顺序栈 */
  23. /* ----------------------------------------------------------------------------*/
  24. Status visit(SElemType c)
  25. {
  26. printf("%d ", c);
  27. return OK;
  28. }
  29. /* --------------------------------- 需要用到的顺序栈基本操作 ------------------------------------*/
  30. Status InitStack(SqStack *S)
  31. { /* 构造一个空栈S */
  32. (*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
  33. if (!(*S).base)
  34. exit(OVERFLOW); /* 存储分配失败 */
  35. (*S).top = (*S).base;
  36. (*S).stacksize = STACK_INIT_SIZE;
  37. return OK;
  38. }
  39. Status StackEmpty(SqStack S)
  40. { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
  41. if (S.top == S.base)
  42. return TRUE;
  43. else
  44. return FALSE;
  45. }
  46. Status Push(SqStack *S, SElemType e)
  47. { /* 插入元素e为新的栈顶元素 */
  48. if ((*S).top - (*S).base >= (*S).stacksize) /* 栈满,追加存储空间 */
  49. {
  50. (*S).base = (SElemType *)realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
  51. if (!(*S).base)
  52. exit(OVERFLOW); /* 存储分配失败 */
  53. (*S).top = (*S).base + (*S).stacksize;
  54. (*S).stacksize += STACKINCREMENT;
  55. }
  56. *((*S).top)++ = e;
  57. return OK;
  58. }
  59. Status Pop(SqStack *S, SElemType *e)
  60. { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
  61. if ((*S).top == (*S).base)
  62. return ERROR;
  63. *e = *--(*S).top;
  64. return OK;
  65. }
  66. /* -------------------------------------------------------------------------------------------------*/
  67. void conversion()
  68. { /* 对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数 */
  69. SqStack s;
  70. unsigned n; /* 非负整数 */
  71. SElemType e;
  72. InitStack(&s); /* 初始化栈 */
  73. printf("n(>=0)=");
  74. scanf_s("%u", &n); /* 输入非负十进制整数n */
  75. while (n) /* 当n不等于0 */
  76. {
  77. Push(&s, n % 16); /* 入栈n除以16的余数(16进制的低位) */
  78. n = n / 16;
  79. }
  80. while (!StackEmpty(s)) /* 当栈不空 */
  81. {
  82. Pop(&s, &e); /* 弹出栈顶元素且赋值给e */
  83. if (e <= 9)
  84. printf("%d", e);
  85. else
  86. printf("%c", e + 55);
  87. }
  88. printf("\n");
  89. }
  90. void main()
  91. {
  92. conversion();
  93. }

 

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/293806
推荐阅读
相关标签
  

闽ICP备14008679号