看完小王八老师的数据结构栈的课程,我觉得有必要联系进制转换,写下来记录一下。
数据结构练习——栈(进制转换)C语言实现
首先模拟栈
使用字符串模拟栈,用动态创建的方法模拟栈结构比较好,但是我是数据结构小白,所以见笑了。
下面贴上我的c工程里的头文件中栈的代码:
//定义栈
struct Stack
{
char mData[100];
int mLen;
};
//初始化栈
void InitStack(struct Stack *S)
{
S->mLen = -1;
}
//元素入栈
void Push(struct Stack *S,char item)
{
S->mData[++S->mLen] = item;
}
//元素出栈
char Pop(struct Stack *S)
{
return S->mData[S->mLen--];
}
//返回栈顶元素
char Top(struct Stack *S)
{
return S->mData[S->mLen];
}
//清空栈
void Clear(struct Stack *S)
{
int i;
for(i = 0;i<=S->mLen;i++)
{
Pop(S);
}
}
//是否为空 是空返回1 否则返回0
int StackEmpty(struct Stack *S)
{
if(S->mLen == -1)
return 1;
else
return 0;
}
接下来贴图说明一下,几种进制转换实现方法:
十进转八进:
void converse_Dec_to_Oct() //十进制转八进制
{
int N;
char e;
struct Stack S;
InitStack(&S);
printf("Decimal to Octonary(8) please input data:\n");
scanf("%d",&N);
//转换
while(N)
{
Push(&S,(char)(N%8+48));
N = N/8;
}
//输出
printf("converse:");
while(!StackEmpty(&S))
{
e = Pop(&S);
printf("%c",e);
}
}
二进制转十进制:
void converse_bin_to_Dec() //二进制转换十进制,使用一个栈
{
struct Stack s;
InitStack(&s);
char str[100];
int outcome=0; //记录结果
int i;
printf("binary to Decimal(10) please input data:\n");
scanf("%s",str);
// 压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,str[i]);
}
//转换
for(i=0;!StackEmpty(&s);i++)
{
outcome += (int)(Pop(&s)-48)*pow(2,i); //字符转int
}
//输出
printf("converse:");
printf("%d",outcome);
}
二进制转换八进制:
可以看到,二进制的3位转换为8进制的1位,所以将二进制串按照3为一个组,转换为8进制的一位压入8进制栈中。
而且此处体现出栈的特点FILO(First In Last Out),转换完成后输出8进制栈的时候正好是各位顺序正确的8进制数。
注意有时候会有不足二进制栈剩余三位的情况,需要稍微处理一下,上代码:
void converse_bin_to_Oct() //二进制转换八进制,使用两个栈
{
struct Stack s,t;
int temp=0;
char str[100];
InitStack(&s);InitStack(&t);
int i;
printf("binary to octonary(8) please input binary data:\n");
scanf("%s",str);
// binary元素压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,str[i]);
}
//转换
while(!StackEmpty(&s))
{
temp=0; //每次循环执行时temp置0
for(i=0;i<3&&!StackEmpty(&s);i++) //当读取三位binary或者binary栈为空时跳出
temp += (int)(Pop(&s)-48)*pow(2,i);
Push(&t,(char)(temp+48)); //转换后的8进制数压入8进制栈
}
//输出8进制栈
printf("converse:");
while(!StackEmpty(&t))
{
printf("%c",Pop(&t));
}
}
二进制转换十六进制:
原理和8进制一样,不赘述了,但是注意十六进制使用A-F表示10-15:
void converse_bin_to_Hex() //二进制转换十六进制,使用两个栈
{
struct Stack s,t;
int temp=0;
char str[100];
InitStack(&s);InitStack(&t);
int i;
printf("binary to Hexadecimal(16) please input data:\n");
scanf("%s",str);
// binary元素压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,(int)(str[i]-48));
}
//转换
while(!StackEmpty(&s))
{
temp=0; //每次循环执行时temp置0
for(i=0;i<4&&!StackEmpty(&s);i++) //当读取三位binary或者binary栈为空时跳出
temp += Pop(&s)*pow(2,i);
if(temp<=9)
Push(&t,(int)(temp+48)); //转换后的8进制数压入8进制栈
else
{
switch(temp)
{
case 10:Push(&t,'A');break;
case 11:Push(&t,'B');break;
case 12:Push(&t,'C');break;
case 13:Push(&t,'D');break;
case 14:Push(&t,'E');break;
case 15:Push(&t,'F');break;
}
}
}
//输出16进制栈
printf("converse:");
while(!StackEmpty(&t))
{
printf("%c",Pop(&t));
}
}
下面贴上整个main.c代码,头文件在上面贴出来了。
#include <stdio.h>
#include <stdlib.h>
#include "head.h"
#include <math.h>
#include <string.h>
// 栈使用字符串模拟
void converse_Dec_to_Oct() //十进制转八进制
{
int N;
char e;
struct Stack S;
InitStack(&S);
printf("Decimal to Octonary(8) please input data:\n");
scanf("%d",&N);
//转换
while(N)
{
Push(&S,(char)(N%8+48));
N = N/8;
}
//输出
printf("converse:");
while(!StackEmpty(&S))
{
e = Pop(&S);
printf("%c",e);
}
}
void converse_bin_to_Dec() //二进制转换十进制,使用一个栈
{
struct Stack s;
InitStack(&s);
char str[100];
int outcome=0; //结果
int i;
printf("binary to Decimal(10) please input data:\n");
scanf("%s",str);
// 压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,str[i]);
}
//转换
for(i=0;!StackEmpty(&s);i++)
{
outcome += (int)(Pop(&s)-48)*pow(2,i); //字符转int
}
//输出
printf("converse:");
printf("%d",outcome);
}
void converse_bin_to_Oct() //二进制转换八进制,使用两个栈
{
struct Stack s,t;
int temp=0;
char str[100];
InitStack(&s);InitStack(&t);
int i;
printf("binary to octonary(8) please input binary data:\n");
scanf("%s",str);
// binary元素压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,str[i]);
}
//转换
while(!StackEmpty(&s))
{
temp=0; //每次循环执行时temp置0
for(i=0;i<3&&!StackEmpty(&s);i++) //当读取三位binary或者binary栈为空时跳出
temp += (int)(Pop(&s)-48)*pow(2,i);
Push(&t,(char)(temp+48)); //转换后的8进制数压入8进制栈
}
//输出8进制栈
printf("converse:");
while(!StackEmpty(&t))
{
printf("%c",Pop(&t));
}
}
void converse_bin_to_Hex() //二进制转换十六进制,使用两个栈
{
struct Stack s,t;
int temp=0;
char str[100];
InitStack(&s);InitStack(&t);
int i;
printf("binary to Hexadecimal(16) please input data:\n");
scanf("%s",str);
// binary元素压入栈
for(i=0;i<strlen(str);i++)
{
Push(&s,(int)(str[i]-48));
}
//转换
while(!StackEmpty(&s))
{
temp=0; //每次循环执行时temp置0
for(i=0;i<4&&!StackEmpty(&s);i++) //当读取三位binary或者binary栈为空时跳出
temp += Pop(&s)*pow(2,i);
if(temp<=9)
Push(&t,(int)(temp+48)); //转换后的8进制数压入8进制栈
else
{
switch(temp)
{
case 10:Push(&t,'A');break;
case 11:Push(&t,'B');break;
case 12:Push(&t,'C');break;
case 13:Push(&t,'D');break;
case 14:Push(&t,'E');break;
case 15:Push(&t,'F');break;
}
}
}
//输出16进制栈
printf("converse:");
while(!StackEmpty(&t))
{
printf("%c",Pop(&t));
}
}
int main()
{
int choose=0;
printf("which conversion do want to choose:\n10 ot 8:1\n2 to 10:2\n2 to 8: 3\n2 to 16:4\n\ninput: ");
scanf("%d",&choose);
fflush(stdin);
switch(choose)
{
case 1:converse_Dec_to_Oct();
case 2:converse_bin_to_Dec();
case 3:converse_bin_to_Oct();
case 4:converse_bin_to_Hex();
}
printf("\nHello world!\n");
return 0;
}
数据结构小白,有不对的地方,请大佬指出,谢谢!