补充完善下面的C语言代码,实现顺序栈的基本操作,然后借助所实现的顺序栈完成十进制数转八进制数的算法(请参考课本算法3.1),最后在主函数中测试该算法(测试用例:(1348)10=(2504))8.
/*①顺序栈的定义*/
typedef struct
{
ElemType *base ; // 栈底指针
ElemType *top ; // 栈顶指针
int stacksize ; // 栈的可用最大容量
}SqStack;
/*②栈的基本操作接口定义*/
//1.初始化栈:
//将栈S置为一个空栈(不含任何元素)
Status InitStack(SqStack &S);
//2.销毁栈
Status DestoryStack(SqStack &S);
//3.进栈:
//将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压入”。
Status Push(SqStack &S, ElemType e );
//4.出栈:
//删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。
Status Pop(SqStack &S, ElemType &e);
//5.取栈顶元素:
//取栈S中栈顶元素。
float GetTop(SqStack S);
//6.判栈空:
//判断栈S是否为空,若为空,返回值为true,否则返回值为false。
Status StackEmpty(SqStack S);
//7.遍历栈元素
//从栈底元素向栈顶元素逐个遍历
Status StackTraverse(SqStack S);
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status ;
typedef int ElemType;
typedef struct
{
ElemType *base ; // 栈底指针
ElemType *top ; // 栈顶指针
int stacksize ; // 栈的可用最大容量
}SqStack;
/*②栈的基本操作接口定义*/
//1.初始化栈:
//将栈S置为一个空栈(不含任何元素)
Status InitStack(SqStack &S);
//2.销毁栈
Status DestoryStack(SqStack &S);
//3.进栈:
//将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压入”。
Status Push(SqStack &S, ElemType e );
//4.出栈:
//删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。
Status Pop(SqStack &S, ElemType &e);
//5.取栈顶元素:
//取栈S中栈顶元素。
Status GetTop(SqStack S,ElemType &e);
//6.判栈空:
//判断栈S是否为空,若为空,返回值为true,否则返回值为false。
Status StackEmpty(SqStack S);
//7.遍历栈元素
//从栈底元素向栈顶元素逐个遍历
Status StackTraverse(SqStack S);
//非负数的十进制转八进制
void conversion();
//1.初始化栈:
//将栈S置为一个空栈(不含任何元素)
Status InitStack(SqStack &S)
{
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S.base) exit (OVERFLOW); //存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
//2.销毁栈
Status DestoryStack(SqStack &S)
{
ElemType *p;
p=S.base;
free(p);
S.base=NULL;
return OK;
}
//3.进栈:
//将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压入”。
Status Push(SqStack &S, ElemType e )
{
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(ElemType *)realloc(S.base,
(S.stacksize+STACK_INIT_SIZE)*sizeof(ElemType));
if(!S.base) exit (OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
//4.出栈:
//删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。
Status Pop(SqStack &S, ElemType &e)
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//pop
//5.取栈顶元素:
//取栈S中栈顶元素。
Status GetTop(SqStack S,ElemType &e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//gettop
//6.判栈空:
//判断栈S是否为空,若为空,返回值为true,否则返回值为false。
Status StackEmpty(SqStack S)
{
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
//7.遍历栈元素
//从栈底元素向栈顶元素逐个遍历
Status StackTraverse(SqStack S)
{
ElemType *p;
p = S.base;
while(S.top> p)
printf ("%s", *p++);
return OK;
}
//非负数的十进制转八进制
void conversion()
{
int N;
ElemType e;
SqStack S;
InitStack(S);
printf("请输入要转换成八进制的数(非负数):");
scanf("%d",&N);
while(N)
{
Push(S,N%8);
N=N/8;
}
printf("八进制数为:");
while(!StackEmpty(S))
{
Pop(S,e);
printf("%d",e);
}
printf("\n");
}//conversion
void main()
{
conversion();
system("pause");
}