这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
什么是栈?
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序
根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数,得到余数和商,此过程一直进行,直到得到的商为0时停止,此时得到的所有余数逆序排列就是转换得到的二进制数。十进制转换其他进制(八、十六)方法和当前方法相同,故可以扩展得到十进制向二、八、十六进制转换的统一算法。由于十进制数转换其他进制数时符合栈的特点“先进后出”,即先得到的余数是低位,后得到的余数是高位,因此这里利用栈做工具,保存转换过程中得到的余数。这里的栈需要自己定义,可以定义顺序栈,也可以定义链栈。可以将栈的定义及其基本操作放在一个头文件中,如果哪个程序需要就可以包含该头文件,而不需要每次都重新编写栈的代码。
链栈
头文件<shujujiegou_lianzhan.h>
#include <stdlib.h>
typedef char ElemType ;
typedef struct linknode
{ ElemType data;
struct linknode *next;
}LiStack;
void InitStack(LiStack * &s);//构造空栈
void DestoryStack(LiStack * &s);//销毁栈
bool StackEmpty(LiStack * s);//判栈空
void Push(LiStack * &s, ElemType e);//压栈
bool Pop(LiStack * &s, ElemType &e);//出栈
bool GetTop(LiStack * s, ElemType &e);//取栈顶元素
void InitStack(LiStack * &s)
{
s = (LiStack * )malloc(sizeof(LiStack));
s -> next = NULL;
}
void DestoryStack(LiStack * &s)
{
LiStack * p = s, *q = s -> next;
while(q != NULL)
{
free(p);
p = q;
q = p -> next;
}
}
bool StackEmpty(LiStack * s)
{
return (s -> next == NULL);
}
void Push(LiStack * &s, ElemType e)
{
LiStack * p;
p = (LiStack *)malloc(sizeof(LiStack));
p -> data = e;
p -> next = s -> next;
s -> next = p;
}
bool Pop(LiStack * &s, ElemType &e)
{
LiStack * p;
if(s -> next == NULL)
return false;
p = s -> next;
e = p -> data;
s -> next = p -> next;
free(p);
return true;
}
bool GetTop(LiStack * s, ElemType &e)
{
if(s -> next == NULL)
return false;
e = s -> next -> data;
return true;
}
程序代码
#include<stdio.h>
#include<stdlib.h>
#include"shujujiegou_lianzhan.h"
void trans(int a,int b)
{ LiStack * s;
InitStack(s);
int yu;
ElemType e;
while(a)
{
yu = a % b;
if(yu >= 10)
{
ElemType p = yu + 'A' - 10;//转换为对应字符的ASCII值
Push(s, p);
}
else
{
ElemType p = yu + '0';//转换为对应数字字符的ASCII值
Push(s, p);
}
a /= b;
}
while(!StackEmpty(s))
{
Pop(s, e);
printf("%c", e);
}
printf("\n");
DestoryStack(s);
}
int main()
{
int n;
while(1)
{
printf("————十进制向二进制、八进制、十六进制转换器—————\n\n");
printf("请输入一个十进制数(要求大于或等于零,其他则退出!):");
scanf("%d", &n);
if(n<0) break;
printf("十进制数%d转换为二进制数为:",n);
trans(n,2);
printf("十进制数%d转换为八进制数为:",n);
trans(n,8);
printf("十进制数%d转换为十六进制数为:",n);
trans(n,16);
system("pause");//暂停作用,包含在stdlib.h中
system("cls");//清屏作用,包含在stdlib.h中
}
return 0;
}
运行结果图