《数据结构》实验报告(四)之用栈完成数制转换

二、实验内容

利用栈进行数制转换,以m进制数向n进制数转换为例。用栈编写满足下列要求的程序:

对输入的任意个非负m进制数,打印出与其值相等的n进制数。

具体实现过程:

1、定义栈,包括初始分配,栈顶指针,栈底指针。

2、定义需要用到的函数。

(1)构造空栈:InitStack()

(2)进栈:Push()

(3)出栈:Pop()

(4):数制转换函数:Conversion()

3、对函数进行连接。

程序代码:(不允许粘图,重点语句加上注释)

#include <stdio.h>

#include <malloc.h>      

#define STACK_INIT_SIZE 100  //存储空间初始分配量

#define STACKINCREAMENT 10//存储空间分配增量

struct SqStack {

  int* base; //栈的基址即栈底指针

  int* top; //栈顶指针

  int stacksize;   //当前分配的空间

};

//构造空栈

void InitStack(SqStack& S)

{

  S.base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));//开辟空间

  S.stacksize = STACK_INIT_SIZE;//初始分配量

  S.top = S.base;//初始化空栈

}

//判空

int StackEmpty(SqStack S)

{

  //若栈不空,删除栈S的栈顶元素,用e返回,返回值1

  //若栈空,返回0

  if (S.base == S.top)

      return 1;

  else

      return 0;

}

//获得栈顶元素

void GetTop(SqStack S, int& e)

{

  e = *(S.top - 1);//栈顶指针始终在栈顶元素下一位置

}

//进栈

void push(SqStack& S, int e)

{

  *(S.top) = e;

  S.top++;

}

//出栈

void pop(SqStack& S, int& e)

{

  if (S.base != S.top)

  {

      S.top--;

      e = *S.top;

  }

}

//数制转换函数

void convert(SqStack& S, int N, int n)

{

  InitStack(S);

  do

  {

      push(S, N % n);

      N /= n;

  } while (N != 0);

  int i, e;

  while (!StackEmpty(S)) //当栈不空

  {

      pop(S, e); // 弹出栈顶元素且赋值给e

      if (e > 9)//十六进制时输出字母

      {

          e = e + 55;// 大于9的余数,输出相应的字符

          printf("%c", e);

      }

      else

          printf("%d", e);

  }

  printf("\n");

}

//主函数开始

int main()

{

  int i, num;

  unsigned n, N;//要转换成的进制数和要转换的数

  SqStack s;

  InitStack(s);//初始化空栈

  printf("输入要转换的十进制数:\n");

  scanf("%d", &N);

  printf("输入要转换为的进制数:\n");

  scanf("%d,", &n);

  printf("%d转换为%d进制后为:\n", N, n);

  convert(s, N, n);

}

程序测试及运行结果:

分析与讨论:

        第一次运行时不能正常输出,发现是在StackEmpty()函数时候搞反了真值条件,十进制转八进制用到的思想是短除法,然后进行倒序取余,体现了栈的思想。

此次上机实验,我不仅对栈的存储等操作有了一定的认识,也对进制间的转换有了深刻的理解,同时对编译程序的算法思想有了新的认识,还让我深刻的体会到了链表的重要性以及其应用的方便,并且对指针加深了印象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。完成这次实验的主要难点仅在于对栈的理解和对栈操作的编写。我们应当理解在将十进制转化为其他进制要用到栈,是因为在进制转换算法中,商的取得是逆序输出的,正好满足栈先入先出的特点。这才是我们要选择用栈的原因,而非盲目用栈。

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值