栈的应用(数制转换)


程序功能:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。

头文件:c3-1.h

#ifndef C_3_1_H
	#define C_3_1_H

#include <stdio.h>				
#include <stdlib.h>
#include <malloc.h>

#define TRUE 1
#define FALSE 0

#endif

algorithm.h

//头文件里面最好只放声明类的文件

#ifndef ALGORITHM_H
	#define ALGORITHM_H

#include "c3-1.h"

typedef int ElementType;
//结点
typedef struct node
{
	int data;
	struct node *pNext;					//这个指针需要指向下一个结点
}NODE, *PNODE;
//栈
typedef struct StackRecord
{
	PNODE base;
	PNODE top;
}Stack, *PStack;

//函数声明
int InitStack(PStack s);
int StackEmpty(PStack s);
int DestroyStack(PStack s);
int ClearStack(PStack s);
void Push(PStack s, int value);
int Pop(PStack s, int *e);

#endif

子程序

#include "algorithm.h"
#include "c3-1.h"

//初始化一个链表栈
int InitStack(PStack s)
{ 
	s->top = (NODE *)malloc(sizeof(NODE));
	if (NULL == s->top)
	{
		printf("Error!\n");
		return FALSE; 
	}
	else
	{
		s->base = s->top;
		s->top->pNext = NULL;
		return TRUE;
	}
}

//销毁一个栈
int DestroyStack(PStack s)
{
	free(s->base);
	s->base = NULL;
	free(s->top);
	s->top = NULL;

	return TRUE;
}

int ClearStack(PStack s)
{
	s->top = s->base;
	return TRUE;
}
//入栈
void Push(PStack s, int value)
{
	PNODE pNew = (NODE *)malloc(sizeof(NODE));
	pNew->data = value;
	pNew->pNext = s->top;
	s->top = pNew;
}
//判断栈是否为空
int StackEmpty(PStack s)
{
	return s->top==s->base;
}
//出栈
int Pop(PStack s, int *e)
{
	if (StackEmpty(s))
	{
		printf("栈为空,出栈失败!\n");
		return FALSE;
	} 
	else
	{
		PNODE p = s->top;
		*e = p->data;
		s->top = p->pNext;
		free(p);
		p = NULL;
		return TRUE;
	}
}

测试主函数:

/*	
	对于输入的任意一个非负十进制整数,
	打印输出与其等值的八进制数
*/
#include "algorithm.h"
#include "c3-1.h"


int main(void)
{
	Stack s;
	unsigned n = 0;
	int e = 0;
	int i = 0;
		
	i = InitStack(&s);
	printf("栈初始化是否成功;%d(1:成功,0:失败!)\n", i);
	printf("n(>=0) = ");
	scanf("%u", &n);
	while (n)
	{
		Push(&s, n%8);
		n = n / 8;
	}
	while(!StackEmpty(&s))
	{
		Pop(&s, &e);
		printf("%d", e);
	}
	printf("\n");
	return 0;
}

运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值