实验目的
- 深入理解栈的“后进先出”特性
- 掌握栈的两种存储结构类型定义及基本算法
- 能在实际问题背景下灵活运用栈
Description
利用栈完成数制转换,能够完成十进制向二进制、八进制、十六进制的转换
.cpp文件名后缀名
这里我采用栈的顺序存储结构
Source Code
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize]; //存放栈中的数据元素
int top; //栈顶指针,即存放栈顶元素在data数组中的下标
}SqStack;
//初始化栈
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//判断栈是否为空
bool StackEmpty(SqStack *s)
{
return (s->top==-1);
}
//进栈
bool Push(SqStack *&s,ElemType &e)
{
if(s->top==MaxSize-1)
return false;
else
{
s->top++;
s->data[s->top]=e;
return true;
}
}
//出栈
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top == -1)
return false;
else
{
e=s->data[s->top];
s->top--;
return true;
}
}
//销毁栈
void DestotyStack(SqStack *&s)
{
free(s);
}
//数值转换
void Conversion(int a,int b)
{
SqStack *s;
int x;
InitStack(s);
while(a > 0)
{
x = a%b;
Push(s,x);
a /= b;
}
printf("转换成%d进制为:",b);
while(!StackEmpty(s))
{
Pop(s,x);
switch(x)
{
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: x+=87;break;
default :x+=48;
}
printf("%c",x);
}
DestotyStack(s);
printf("\n");
}
int main(void)
{
int a,b;
printf("请输入需要数制转换的十进制数:");
scanf("%d",&a);
printf("请输入要转换的制数:");
scanf("%d",&b);
Conversion(a,b);
return 0;
}
Computational Results
十进制转二进制
十进制转八进
十进制转十六进制
Analyze
部分数的进制转换表
C语言格式输出类型问题
- x是int类型为何要用%c输出?
因为在十进制转十六进制时当十进制数据过大,转成的十六进制数就会出现一些字符,干脆统一以%c格式输出 - 为何x+=48; x+=87;
数值(字符)0—9对应的ASCII值分别是48—57;
十进制中10—15对应十六进制中的a—f, ASCII值分别是97—102;
下图是一个顺序栈的操作示意图
栈可以采用顺序存储结构来存放栈内元素,并用一变量(如top)始终指向栈顶元素以反映栈中元素的变化
- 栈空的条件:s - > top == -1
- 栈满的条件:s - > top ==MaxSize - 1(data数组的最大下标)
- 元素e的进栈操作:现将栈顶指针 top 增加 1,然后将元素 e 放在栈顶指针处
- 出栈操作:现将栈顶指针 top 元素处的元素取出放在 e 中,然后将栈顶指针减 1