数制转换(栈的应用)
- 格式:doc
- 大小:37.00 KB
- 文档页数:4
实验二栈的应用(数制转换)
一、实验目的
掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。二、实验要求
1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存程序的运行结果,并结合程序进行分析。
三、实验内容
利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。算法为:
1、定义栈的顺序存取结构
2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)
3、定义一个函数用来实现上面问题:
(1)十进制整数X和R作为形参
(2)初始化栈
(3)只要X不为0重复做下列动作
将X % R入栈, X=X/R
(4)只要栈不为空重复做下列动作
栈顶出栈 , 输出栈顶元素
四、实验报告要求:
1、十进制整数转化为R进制整数算法的代码;
2、程序运行结果及分析;
3、实验总结。
具体实现:
/*
栈(综合)时间------2012 3 16
*/
# include
# include
# include
typedef struct node
{
int data;
struct node *next;
}NODE , *PNODE;
typedef struct stack
{
PNODE top; //!!!!节点指针类型,用于保存当前栈顶节点的地址(top 和 bottom 均为栈所需成员)
PNODE bottom; //!!!节点指针类型,用于保存栈内最后一个节点的下一个无实际含义节点的地址,操作中,此指针无需变更
}STACK , *PSTACK;
void push_stack(PSTACK ps,int val);
void init_stack(PSTACK ps);
void travel_stack(PSTACK ps);
bool is_empty(PSTACK ps);
void pop_stack(PSTACK ps,int * val);
void swap_stack(PSTACK ps,int val,int R);
int main(void)
{
STACK s;
int X;
int R;
init_stack(&s); //对 s 的两个参数进行初始化(top 和 bottom)printf("请输入你想转换的数X和想转换成的进制R:");
scanf("%d%d",&X,&R);
swap_stack(&s,X,R);
travel_stack(&s);
return 0;
}
void init_stack(PSTACK ps)
{
ps->top = (PNODE)malloc(sizeof(NODE)); //动态分配了一个NODE类型节点,并把首地址赋给ps->top(即由ps->top指向)
if (NULL == ps->top)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
ps->top->next = NULL; //
ps->bottom = ps->top; //刚开始栈顶指针和尾指针指向同一个节点(即栈里最后一个节点的下一个无实际含义的节点),并将该
节点指针域清空
}
return;
}
void push_stack(PSTACK ps,int val)
{
PNODE p = (PNODE)malloc(sizeof(NODE)); //创建新结点,并把结点首地址赋给P
p->data = val; //把输入值赋给新结点的数据域
p->next = ps->top; //上一次栈顶地址由p->top 保存的,现在赋给新栈顶 p->next(p->top保存的是结点整体的地址,而p的指针域p->next也是保存结点整体的地址)
ps->top = p; //再把栈顶指针指向新栈顶结点(新节点地址赋给栈顶指针)
return;
}
void travel_stack(PSTACK ps) //遍历输出函数
{
PNODE p = ps->top; //工作指针先指向栈顶
while(p != ps->bottom) //当工作指针 = 尾指针时,遍历结束
{
printf("%d",p->data);
p = p->next; //工作指针逐步下移}
printf("\n");
return;
}
void pop_stack(PSTACK ps,int * pval)
{
if(is_empty(ps))
{
return ;
}
else
{
PNODE q = ps->top; //再定义一个节点指针类型,用于保存待出栈节点地址,一边下面的free(q)(释放内存)(q和ps->top类型一样,都是保存结点整体地址的)
*pval = q->data; //保存出栈数据,形参*val