数据结构 栈的应用举例

数制转换问题

问题描述:输入一个非负的十进制整数,然后输出与其等值的八进制数。

该问题用栈这一数据结构来解充分说明了栈的先进先出后进后出的特性。本质就是对十进制数进行除以八取余数,最后逆序输出余数。可以将最初得到的那个余数存在栈里,然后最终输出时就可以最后输出这个余数。将八改成二或者其它的数可以求得其它进制的数。

#include<stdio.h>

#define TRUE 1
#define FALSE 0
/***************************************************************************************************
									  栈的顺序存储表示
****************************************************************************************************/
const int STACK_INIT_SIZE = 100;   //顺序栈默认的初始分配最大空间量
const int STACKINCREMENT = 10;     //默认的增补空间量
typedef struct {
	int *elem;             //存储数据的数组
	int top;              //栈顶指针
	int stacksize;         //当前分配的最大容量
	int incrementsize;     //约定的增补空间量
}SqStack;
/*****************************************************************************************************
											  建表
******************************************************************************************************/
void InitStack_Sq(SqStack &S, int maxsize = STACK_INIT_SIZE, int incresize = STACKINCREMENT)
{
	//构造一个空栈S,初始化分配的最大空间为maxsize,预设的增补空间量为incresize
	S.elem = new int[maxsize];        //为顺序栈分配最大容量为maxsize的数组空间
	S.top = -1;                       //顺序栈中当前所含元素个数为零
	S.stacksize = maxsize;            //该顺序栈可容纳maxsize个数据元素
	S.incrementsize = incresize;      //需要时每次扩容incresize个元素的空间
}

/*****************************************************************************************************
											插入
******************************************************************************************************/
void incrementStacksize(SqStack &S)
{
	int *a;
	a = new int[S.stacksize + S.incrementsize];
	for (int i = 0; i <= S.top; i++)
		a[i] = S.elem[i];
	delete[]S.elem;
	S.elem = a;
	S.stacksize = S.stacksize + S.incrementsize;
}
void Push_Sq(SqStack &S, int e)
{
	//插入元素e为新的栈顶元素
	if (S.top == S.stacksize - 1)
		incrementStacksize(S);       //若空间不够则扩容重新分配空间,类似于顺序表
	S.elem[++S.top] = e;
}
/*****************************************************************************************************
												删除
******************************************************************************************************/
bool Pop_Sq(SqStack &S, int &e)
{
	//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回TRUE,否则饭返回FALSE
	if (S.top == -1)
		return FALSE;
	e = S.elem[S.top--];
	return TRUE;
}
/******************************************************************************************************
											判断
*******************************************************************************************************/
bool StackEmpty(SqStack S)
{
	//若栈S为空栈,则返回TRUE,否则返回FALSE
	if (S.top == -1)
		return TRUE;
	else
		return FALSE;
}

/******************************************************************************************************
											功能函数
*******************************************************************************************************/
void conversion()
{
	//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
	SqStack S;
	int N;    //用于保存输入的十进制整数
	int e;
	InitStack_Sq(S);
	scanf("%d", &N);
	while (N)
	{
		Push_Sq(S, N % 8);   //余数入栈
		N = N / 8;           //商继续运算
	}
	while (!StackEmpty(S))
	{
		Pop_Sq(S, e);     //和求余所得相逆的顺序输出八进制的个位数
		printf("%d", e);
	}
}
/******************************************************************************************************
											主函数
*******************************************************************************************************/
void main()
{
	conversion();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值