实验名称:栈的进制转换
实验目的:1.掌握栈表的存储形式及其描述。
2.掌握栈的建立,压入,弹出,查找,删除。
实验内容:1.采用malloc函数动态分配空间
2.创建一定大小的连续空间。
实验代码:
#include<stdio.h>
#include<stdlib.h>
#define Size 100//初值
#define Stack 10 //存储空间分配增量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
typedef struct{
int
a;
}SelemType;
typedef struct{
SelemType *base;
SelemType *top;
int stacksize;//当前分配空间
}SqStack;
SqStack S;//全局变量
//初始化栈
status InitStack( SqStack *S)
{
S->base=(SelemType*)(malloc(Size*sizeof(SelemType)));
if(!S->base)
exit(0);
S->top=S->base;
S->stacksize=Size;
return
OK;
}
status push(SqStack *S,SelemType e)
{
if(S->top-S->base>=S->stacksize){
S->base=(SelemType*)malloc((S->stacksize+Stack)*sizeof(SelemType));
if(!S->base)
exit( 0);
S->top=S->base+S->stacksize;
S->stacksize+=Size;
}
*S->top++=e;
return OK;
}
status pop(SqStack *S,SelemType *e){
if(S->top==S->base) return ERROR;
*e=*--S->top;
return OK;
}
//判断栈空
status Stackempty(SqStack *S)
{
if(S->top==S->base)
return
TRUE;
return
FALSE;
}
//进制转换
void Coversion(SqStack *S,int n,int x){
SelemType e;
while(n)
{
e.a=n%x;
push(S,e);
n=n/x;
}
while(!Stackempty(S)){
pop(S,&e);
printf("%d",e) ;
}
}
int main(){
int
n,x;
InitStack(&S);
printf("亲输入转换为的进制和一个十进制数:");
scanf("%d%d",&x,&n);
Coversion(&S,n,x);
return
OK;
测试结果
实验分析:(实验中出现的问题,注意的问题以及如何修改的等等)
在开始时,不知道#define Stack 10的作用
解决://存储空间分配增量
2.不知道如何调用自定义函数typedef struct{
int a;
}
和如何使用;
解决:对其重命名使用
在弹栈时对判断逻辑关系有混淆
解决:
if(!S->base)
exit( 0);
S->top=S->base+S->stacksize;//对栈的扩展刚开始出现了错误
S->stacksize+=Size;
刚开始对弹栈条件语句出现难点
解决:添加了判断栈空函数完美解决。
实验心得:(此次实验收获、体会和经验介绍)
栈的算法很精妙,可以解决很多现实问题,比如逆序输出,保护现场(保存现场)等,都可以简单高效解决,而且存储片区是连续一片,比较安全。