#include "stdio.h"
#include "malloc.h" //用于malloc、realloc函数
#define size 10 //存储空间分配增量
typedef int type;
typedef struct stack
{
type* base;//栈底元素
type* top;//栈顶元素
int stacksize;//栈的空间大小
}Sqstack;
type InitStack(Sqstack* S); //初始化栈函数
type StackEmpty(Sqstack* S); //判断是否为空栈
type Push(Sqstack* S, type e); //入栈
type Pop(Sqstack* S, type* e); //出栈
type GetTOP(Sqstack* S, type* e);//取栈顶元素
void stackprint(Sqstack* S);//遍历栈函数
void conversion();//进制转换
void main()
{
Sqstack S1; //定义栈
int i = 1; //循环选择变量初始值为1
type e; //用于传递参数
while (i)
{
printf("该程序用于实现栈的基本操作\n");
printf("1---------------栈进行初始化\n");
printf("2---------------判断是否空栈\n");
printf("3---------------入栈\n");
printf("4---------------出栈\n");
printf("5---------------取栈顶元素\n");
printf("6---------------进制转换\n");
printf("0---------------退出\n");
scanf_s("%d", &i); //输入i进行操作选择
switch (i)
{
case 1:
if (InitStack(&S1)) //将栈S1传给函数进行初始化,用返回值判断是否初始化成功
{ //初始化成功
printf("栈初始化成功\n\n");
}
else
{ //初始化失败
printf("栈初始化失败\n\n");
}
break;
case 2:
if (StackEmpty(&S1)) //判断栈是否为空栈
{ //返回值1为空栈
printf("该栈是空栈\n\n");
}
else
{ //返回值0不为空栈
printf("该栈不是空栈\n\n");
}
break;
case 3:
printf("请输入要入栈的元素");
scanf_s("%d", &e); //输入入栈元素
Push(&S1, e); //调用函数
stackprint(&S1); //打印栈
break;
case 4:
if (Pop(&S1, &e)) //调用函数出栈 并判断是否出栈成功
{ //出栈成功
printf("出栈的元素是%d\n", e);
stackprint(&S1); //出栈成功 打印栈
}
else
{ //出栈函数返回0,出栈失败
printf("出栈失败\n");
}
break;
case 5:
if (GetTOP(&S1, &e))//调用函数获取栈顶
{ //不为空栈,返回打印栈顶
printf("栈顶元素%d\n", e);
}
else
{ //目前栈为空栈
printf("该栈为空栈\n");
}
break;
case 6:
conversion(); //进制转换函数
break;
}
}
}
type InitStack(Sqstack* S) //初始化栈函数
{
S->base = malloc(sizeof(type) * size); //给栈赋值内存空间
if (S->base) //判断是否初始化成功
{ //初始化成功
S->top = S->base; //初始化成功后,栈为空栈,栈顶就是栈底 没有元素
S->stacksize = size;//初始化成功后,栈的空间大小为赋值给的内存空间基数size
return 1;//初始化成功 返回1用于判断
}
else
{ //初始化失败
return 0;//初始化失败 返回0用于判断
}
}
type StackEmpty(Sqstack* S) //判断是否为空栈
{
if (S->top == S->base)//如果栈顶等于栈底 这个栈就是个空栈
{
return 1;//空栈返回1
}
else
{
return 0;//非空栈返回0
}
}
type Push(Sqstack* S, type e) //入栈
{
if (S->top - S->base >= S->stacksize) //判断当前栈内存空间是否足够
{
S->base = realloc(S->base, sizeof(type) * (size + S->stacksize)); //扩充内存空间
if (S->base)//判断是否扩充成功
{
S->top = S->base + S->stacksize; //栈顶位置改变
S->stacksize += size; //栈的大小改变
}
else
{
return 0; //扩充失败 退出
}
}
*S->top = e;//赋值元素
S->top++;//入栈修改栈顶位置
return 1;
}
type Pop(Sqstack* S, type* e) //出栈
{ //移除栈:将top指针指向栈的下一个元素,栈顶元素不在栈内为出栈
if (S->top == S->base) //判断栈内是否有元素
{
return 0; //没有元素退出
}
else
{
S->top--;//栈顶减1
*e = *S->top; //有元素则将元素赋值给e返回到main函数
//可合并为*e=--*S->top
return 1;
}
}
type GetTOP(Sqstack* S, type* e)//取栈顶元素
{
if (S->top == S->base) //判断栈内是否有元素
{
return 0; //空栈退出
}
else
{
*e = *(S->top-1); //栈顶元素赋值给e返回到main函数
return 1;
}
}
void conversion()//进制转换
{
int n, n1, n2, n3;//存放输入的数
type m;
int B = 2, O = 8, H = 16;//B为2进制 O为8进制 H为16进制
Sqstack S; //定义栈
InitStack(&S); //初始化栈
printf("请输入要转换进制的数"); //输入要转换的数
scanf_s("%d", &n); //输入
n1 = n2 = n3 = n; //将n的值赋值给三个变量,用于每次除模运算
//十进制转换二进制
while (n1)//n1不为0继续循环
{
Push(&S, n1 % B);//n1模2的值入栈
n1 /= B; //n1除2
}
printf("将10进制数%d转为2进制数是", n);
while (!StackEmpty(&S))//判断栈是否为空栈
{
Pop(&S, &m); //入栈的值,逆序出栈
printf("%d", m); //打印每次的栈顶
}
printf("\n");
//十进制转换八进制
while (n2)
{
Push(&S, n2 % O);//n2模8的值入栈
n2 /= O; //n2除8
}
printf("将10进制数%d转为8进制数是", n);
while (!StackEmpty(&S))//判断栈是否为空栈
{
Pop(&S, &m);//入栈的值,逆序出栈
printf("%d", m);//打印每次的栈顶
}
printf("\n");
//十进制转换十六进制
printf("将10进制数%d转为16进制数是", n);
while (n3)
{
Push(&S, n3 % H);//n3模16的值入栈
n3 /= H;//n3除16
}
while (!StackEmpty(&S))//判断栈是否为空栈
{
Pop(&S, &m);//值逐一出栈
if (m < 10) printf("%d", m); //判断出栈的值m
else if (m % H == 10) printf("A");
else if (m % H == 11) printf("B");
else if (m % H == 12) printf("C");
else if (m % H == 13) printf("D");
else if (m % H == 14) printf("E");
else if (m % H == 15) printf("F");
}
printf("\n");
}
void stackprint(Sqstack* S)//遍历栈函数
{
int n = 0; //计数器从0开始
printf("当前栈的元素有:");
while (S->top-n != S->base) //判断top-n后是否等于栈底
{
printf("%d ", *(S->top - n - 1)); //打印top-n-1的元素
n++; //累加器累加
}
printf("\n");//打印
}
数据结构——栈的基本操作(C语言实现)
最新推荐文章于 2022-06-27 18:29:22 发布