目录
题目
将十进制数N转换为八进制数
代码
1.全部代码
#include<stdio.h>
#include<stdlib.h>//包含动态分配内存的库函数
#define STACK_INIT_SIZE 10//栈的初始容量
#define STACKINCREMENT 2//存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;//状态,函数返回值
typedef int SElemType;//栈元素
typedef struct
{
SElemType* top, * base;//别忘了第二个*
int stacksize;//栈的而当前容量
}SqStack;
void conversion();
Status InitStack(SqStack*);
Status Push(SqStack*, SElemType);
Status Pop(SqStack*, SElemType*);
int StackEmpty(SqStack);
int main()
{
conversion();
return OK;
}
//1.进制转换函数
void conversion()
{
SqStack S;//为栈的信息存储分配存储空间
InitStack(&S);//构造一个空栈S
SElemType e;
int N;
printf("enter N:\n");
scanf("%d", &N);
while (N)//当该数或商为0时,代表已求得八进制数的最高非0位
{
Push(&S, N % 8);
N = N / 8;
printf("quotient:%d\n", N);
}
while (!StackEmpty(S))//若栈非空,删除栈顶元素并打印
{
Pop(&S, &e);
printf("%d", e);
}
}
//2.构造一个空栈S(*pS)
Status InitStack(SqStack* pS)
{
pS->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!pS->base)exit(OVERFLOW);//存储空间分配失败
pS->top = pS->base;//初始化栈的信息
pS->stacksize = STACK_INIT_SIZE;
return OK;
}
3.插入元素e为新的栈顶元素
Status Push(SqStack* pS, SElemType e)
{
if (pS->top - pS->base >= pS->stacksize)//栈满,追加存储空间
{
pS->base = (SElemType*)realloc(pS->base,
(pS->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!pS->base)exit(OVERFLOW);//重分配失败,保持原来空间状态
pS->top = pS->base + pS->stacksize;//更新栈顶指针
pS->stacksize += STACKINCREMENT;//更新站的当前容量
}
*pS->top++ = e;//将元素e存入栈顶指针所知空间(变量)
//再使pS->top+1
return OK;
}
4.若栈不空,删除栈S的栈顶元素,用e返回其值,同时返回OK;否则返回ERROR
Status Pop(SqStack* pS, SElemType* p)
{
if (!StackEmpty(*pS))
{
*p = *--pS->top;
return OK;
}
else
return ERROR;
}
5.若栈为空,返回TRUE(1),否则返回FALSE(0)
int StackEmpty(SqStack S)
{
return S.top == S.base;//栈空的条件
}
2.头文件和宏定义
#include<stdio.h>
#include<stdlib.h>//包含动态分配内存的库函数
#define STACK_INIT_SIZE 10//栈的初始容量
#define STACKINCREMENT 2//存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;//状态,函数返回值
typedef int SElemType;//栈元素
typedef struct
{
SElemType* top, * base;//别忘了第二个*
int stacksize;//栈的而当前容量
}SqStack;
void conversion();
Status InitStack(SqStack*);
Status Push(SqStack*, SElemType);
Status Pop(SqStack*, SElemType*);
int StackEmpty(SqStack);
3.主函数
int main()
{
conversion();
return OK;
}
4.核心函数
//1.进制转换函数
void conversion()
{
SqStack S;//为栈的信息存储分配存储空间
InitStack(&S);//构造一个空栈S
SElemType e;
int N;
printf("enter N:\n");
scanf("%d", &N);
while (N)//当该数或商为0时,代表已求得八进制数的最高非0位
{
Push(&S, N % 8);
N = N / 8;
printf("quotient:%d\n", N);
}
while (!StackEmpty(S))//若栈非空,删除栈顶元素并打印
{
Pop(&S, &e);
printf("%d", e);
}
}
5.辅助函数
5.1构造一个空栈
//2.构造一个空栈S(*pS)
Status InitStack(SqStack* pS)
{
pS->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!pS->base)exit(OVERFLOW);//存储空间分配失败
pS->top = pS->base;//初始化栈的信息
pS->stacksize = STACK_INIT_SIZE;
return OK;
}
5.2插入元素e为新的栈顶元素
3.插入元素e为新的栈顶元素
Status Push(SqStack* pS, SElemType e)
{
if (pS->top - pS->base >= pS->stacksize)//栈满,追加存储空间
{
pS->base = (SElemType*)realloc(pS->base,
(pS->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!pS->base)exit(OVERFLOW);//重分配失败,保持原来空间状态
pS->top = pS->base + pS->stacksize;//更新栈顶指针
pS->stacksize += STACKINCREMENT;//更新站的当前容量
}
*pS->top++ = e;//将元素e存入栈顶指针所知空间(变量)
//再使pS->top+1
return OK;
}
5.3删除栈顶元素并返回
4.若栈不空,删除栈S的栈顶元素,用e返回其值,同时返回OK;否则返回ERROR
Status Pop(SqStack* pS, SElemType* p)
{
if (!StackEmpty(*pS))
{
*p = *--pS->top;
return OK;
}
else
return ERROR;
}
5.4判断是否为空栈
5.若栈为空,返回TRUE(1),否则返回FALSE(0)
int StackEmpty(SqStack S)
{
return S.top == S.base;//栈空的条件
}
说明
这个是《数据结构(C语言版)》严蔚敏里的算法,C代码实现。学习记录p48