实验目的

  1. 深入理解栈的“后进先出”特性
  2. 掌握栈的两种存储结构类型定义及基本算法
  3. 能在实际问题背景下灵活运用栈

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
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐