实验目的:熟练掌握栈和队列的特点;掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用;掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用,掌握环形队列的入队和出队等基本操作;加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。
实验内容:定义顺序栈,完成栈的基本操作:空栈、入栈、出栈、取栈顶元素;实现十进制数与八进制数的转换,十进制数与十六进制数的转换和任意进制之间的转换;定义链式队列,完成队列的基本操作:入队和出队。
/*
十进制到其它进制的转换
*/
# include <stdio.h>
# include <malloc.h>
# define N 8 //要转换成的进制
# define INIT_SIZE 5 //栈的初始空间大小
# define INC_SIZE 2 //栈空间增量
//栈结构
typedef struct
{
int * base; //指向栈底,也是栈空间的地址
int * top; //始终指向有效元素的上一个位置
int initsize; //栈的初始空间大小
}Stack;
void convert(int num); //进制转换
void inital_stack(Stack &s); //初始化栈
void push(Stack &s, int m); //元素入栈
void pop(Stack &s, int * val); //元素出栈
int main(void)
{
int num;
printf("请输入一个十进制数 num = ");
scanf("%d", &num);
convert(num);
return 0;
}
//进制换换
void convert(int num)
{
int m; //记录余数
int val; //保存出栈元素
Stack s;
inital_stack(s);
while(0 != num) //当商为0时结束
{
m = num % N; //取模
push(s, m);
num = num / N;
}
printf("转换成%d进制为:", N);
while(s.top != s.base)
{
pop(s, &val);
printf("%d", val);
}
printf("\n");
}
//初始化栈
void inital_stack(Stack &s)
{
s.initsize = INIT_SIZE;
s.base = (int *)malloc(sizeof(int) * INIT_SIZE);
s.top = s.base;
}
//元素m入栈
void push(Stack &s, int m)
{
//判断栈是否满,满则增加栈的容量
if((s.top - s.base) >= s.initsize)
{
s.base = (int *)realloc(s.base, sizeof(int) * s.initsize + INC_SIZE);
s.initsize = s.initsize + INC_SIZE;
}
*(s.top) = m;
s.top ++;
}
//元素出栈
void pop(Stack &s, int * val)
{
s.top --;
*val = *(s.top);
}