数据结构的设计
栈结构的逻辑结构为线性的,可建立链式结构使得入栈、出栈的操作是动态的,也可以很好地实现进制的转换。而且进制转换恰好和栈的输入输出输出类似,故选择栈是最好的。
功能函数的设计
建立并初始化栈函数 sqstack *Init_seqstack()
功能:该函数实现建立初始化的栈。
具体过程:
1.建立一个栈结构体指针s;
2.将s指针指向的s->top赋予-1,即定义栈顶初始为空。
判栈空函数 int note(sqstack *t)
功能:该函数实现判断栈是否为空,栈为空则返回1,否则返回0。
判栈满函数 int isfull(sqstack *t)
功能:该函数实现判断栈是否为空,栈为满则返回1,否则返回0。
入栈函数 int pop1(sqstack *t,int data)
功能:该函数实现将元素依次入栈放于栈顶位置s->top。
具体过程:
1.先判断栈是否满,若栈已满,则不能执行入栈操作,返回0;
2.若栈不满,则将栈顶指针向上移,将元素入栈到栈顶位置。
出栈函数 int push1(sqstack *t,int *data)
功能:该函数实现将栈顶位置元素依次出栈。
具体过程:
1.先判断栈是否为空,若栈为空,则不能执行出栈操作,返回0;
2.若栈不为空,则将栈顶指针向下移,将栈顶位置元素出栈。
进制转换函数 int zhuan(sqstack *t)
功能:该函数实现将输入的十进制正整数转换为r进制数。
具体过程:
1.先判断栈是否为空,若栈为空,则不执行进制转换,返回0;
2.若栈不为空,则根据入栈的栈顶元素的大小,决定出栈的元素。若入栈栈顶元素小 于10,则直接输出;
若入栈栈顶元素为10/11/12/13/14/15,输出a/b/c/d/e/f;
代码
#include<stdio.h>
#define sm 110 //定义sm的值
#include <malloc.h>
#include <process.h>
#include<iostream>
typedef struct mystack//定义结构体
{
int a[sm]; //声明a[]为整数型组
int top; //声明指针类型
}sqstack;//结构体简称
sqstack *Init_seqstack() //初始化栈
{
sqstack *s; //定义结构体的一个指针s
s=(sqstack*)malloc(sizeof(sqstack));//动态创建一个sqstack类型的空间给指针s
s->top=-1; //定义初始栈值为-1,即为空栈
return s; //返回指针s
}
int isfull(sqstack *t)//判满
{
if (t->top==sm-1) //定义栈满的条件
{
return 1; //栈满返回1
}
return 0; //否则返回0
}
int note(sqstack *t)//判空
{
if(t->top==-1)//定义栈空的条件
{
return 1; //栈空返回1
}
return 0; //否则返回0
}
int pop1(sqstack *t,int data)//入栈
{
if (!isfull(t)) //如果栈不满,执行下列操作
{
(t->top)++;//头指针上移一个位置
t->a[t->top]=data; //将元素放入栈指的位置
return 1;
}
return 0; //否则结束入栈
}
int push1(sqstack *t,int *data)//出栈
{
if(!note(t)) //如果栈不空
{
*data=t->a[t->top];//将指针指的元素赋予data
(t->top)--;//top指针下移
return 1;
}
else return 0; //否则结束出栈
}
int zhuan(sqstack *t) //进制转换
{
int data=t->top;//定义指针元素为整数类型
if(!note(t))//如果指针不空
{
while(data>=0) /*若输入的十进制数为正数*/
{
if(t->a[data]<10) /*若输入的栈顶元素值小于10*/
printf("%d",t->a[data]); /*输出对应进制转换的值*/
else
{
if(t->a[data]==10) printf("a"); /*若输入的栈顶元素值等于10,输出a*/
else if(t->a[data]==11) printf("b");/*若输入的栈顶元素值等于11,输出b*/
else if(t->a[data]==12) printf("c");/*若输入的栈顶元素值等于12,输出c*/
else if(t->a[data]==13) printf("d");/*若输入的栈顶元素值等于13,输出d*/
else if(t->a[data]==14) printf("e");/*若输入的栈顶元素值等于14,输出e*/
else printf("f"); /*若输入的栈顶元素值小于10,输出f*/
}data--;
}
}
}
int main() //主函数
{
sqstack *t; //创建t栈
int n,m,k,r; //定义n,m,k,r类型
int data=0;
t=Init_seqstack(); //将t初始化
printf("请输入要转换的数字:");
scanf("%d",&m);//输入的值赋予m
printf("请输入转换进制数:");
scanf("%d",&r);//输入的值赋予r
while(m)
{
n=m%r;/*将被输入的数整除以进制r得到的余数不断赋予n,再将整数部分给与k, k=m/r; 然后把k赋予m,依次不断往复,求转化值*/
m=k;
pop1(t,n); //将值输入t栈
}
zhuan(t);//将栈里的值进行转换
while(1)
{
push1(t,&n);//元素出栈
}
printf("\n");
}