在学习严蔚敏老师的数据结构之进制转化用顺序栈实现
问题思路分析
首先,在写代码之前,我们先总体梳理一下思路,要实现顺序栈的进制转化,采用数组作为储存方式,为了,便于操作栈里面的元素,我们将栈里面的指针定义成为与数组下标同数据类型,我们已知,要实现进制转化的代码,首先要知道一种进制转化实现的一种算法,一种思路,这里我们采用普遍知道的,求余实现进制转化法,那明确了基本的思路,我们就开始实现。
首先,要使用栈这一种没有被标准c语言封装的数据类型,首先要自己定义相关的数据类型
然后,在实现进制转化的过程中,需要初始化栈,元素入栈,元素出栈,及判断栈是否为空这几个操作,
最后,在主函数里面依次调用对应的函数,然后将出栈的元素依次保存到一个变量里,每出栈一次,打印一次该变量,即可得到该进制转化完成的值。
代码实现
首先
首先,要使用栈这一种没有被标准c语言封装的数据类型,首先要自己定义相关的数据类型
struct SqStack{
int data[max];
int top;
};
其次
然后,在实现进制转化的过程中,需要初始化栈,元素入栈,元素出栈,及判断栈是否为空这几个操作,
//初始化栈
void InitStack(SqStack *S){
S-> top=-1;//初始时,栈顶置为-1
}
//空栈
bool StackEmpty(SqStack *S){
return S->top==-1;
}
//压栈
void Push(SqStack *S,int elem){
//判断特殊情况,栈overflow
if(S->top==max-1){
printf("SqStack S is overflow"); return ;
}
S->data[++S->top]=elem;
}
//出栈
void Pop(SqStack *S,int *elem){
//根据当前操作,排除特殊情况,执行正常操作,
//特殊情况,栈空
if(StackEmpty(S)) {
printf("The SqStack S is empty ");
return ;
}
*elem=S->data[S->top--];
}
最后
最后,在主函数里面依次调用对应的函数,然后将出栈的元素依次保存到一个变量里,每出栈一次,打印一次该变量,即可得到该进制转化完成的值。
int main(){
SqStack S;
int e,N;
//构造空栈
InitStack(&S);
//输入待转化的数
printf("请输入要转化为八进制的数:\n");
scanf("%d",&N);
//将余数压入栈中
while(N){
Push(&S,N%8);
N=N/8;
}
//然后将余数依次出栈
while(!StackEmpty(&S)){
Pop(&S,&e);
printf("%d",e);
}
}
所有代码如下,有需要的自取
#include<stdio.h>
#include<stdbool.h>
#define STACK_INIT_SIZE 100; //
#define STACKINCREMENT 10;
//栈的最大储存长度
#define max 100
//栈结构的定义
//使用数组的储存方式
struct SqStack{
int data[max];
int top;
};
//初始化栈
void InitStack(SqStack *S){
S-> top=-1;//初始时,栈顶置为-1
}
//空栈
bool StackEmpty(SqStack *S){
return S->top==-1;
}
//压栈
void Push(SqStack *S,int elem){
//判断特殊情况,栈overflow
if(S->top==max-1){
printf("SqStack S is overflow"); return ;
}
S->data[++S->top]=elem;
}
//出栈
void Pop(SqStack *S,int *elem){
//根据当前操作,排除特殊情况,执行正常操作,
//特殊情况,栈空
if(StackEmpty(S)) {
printf("The SqStack S is empty ");
return ;
}
*elem=S->data[S->top--];
}
int main(){
SqStack S;
int e,N;
//构造空栈
InitStack(&S);
//输入待转化的数
printf("请输入要转化为八进制的数:\n");
scanf("%d",&N);
//将余数压入栈中
while(N){
Push(&S,N%8);
N=N/8;
}
//然后将余数依次出栈
while(!StackEmpty(&S)){
Pop(&S,&e);
printf("%d",e);
}
}
如果你有什么问题的话,请评论,我看到会及时与你解答