//注意:1、书上写的都不是完成的代码,知识模块话的写了初始化栈,入栈,出栈这些,要明白函数定义中参数的真正含义
//2、mian函数中首先要定义一个栈结构体并且命名
//3、初始化栈时要赋予栈的首地址给initstack函数,而后面所有函数都要加*号
//4、出栈的时候注意保存出栈元素还是直接printf,灵活运用
//********十进制数转任意进制数-栈完成******************
#include<stdio.h>
#include<stdlib.h> // exit(1)需要加这个库;
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define DataType int //宏定义数据类型,方便修改
typedef struct{
DataType *top;
DataType *base;
int stack_size;
}sqstack;//这里定义了结构体栈,包含了栈底指针,栈顶指针还有栈的大小
void Initstack(sqstack *s) //初始化的时候定义的栈叫S1,但是传值给这些调用函数的时候记住它们是指针,要加上*
{
s->base=(DataType *)malloc(STACK_INIT_SIZE*sizeof(DataType));//强制转换的类型不对,已修改
if(!s->base) exit(-1);
s->top=s->base;
s->stack_size=STACK_INIT_SIZE;
}
void Push(sqstack *s, DataType e)//入栈,传入栈的首地址和入栈元素
{
if(s->top-s->base>=s->stack_size )//栈满,追加存储空间
{
s->base=(DataType*)realloc(s->base,(s->stack_size +STACKINCREMENT)*sizeof(DataType));
if(!s->base) exit(-1);//存储分配失败
s->top=s->base+s->stack_size;
s->stack_size+=STACKINCREMENT;
}
*s->top++=e;//入栈一个元素
}
void Pop(sqstack *s)//出栈,本来这里还有一个e作为传值函数,但是实际应用中要直接printf即可,
//没有必要再花一个指针去指向这个出栈元素存储空间。
{
if(s->top==s->base)exit(-1);
printf("%X",*--s->top);//可以输出16进制以内的任何数制
}
int StackEmpty(sqstack *s)
{
if(s->top==s->base) return 1;
else return 0;
}//判断栈是否为空
void conversion(int a,int b)
{
sqstack S1;//不应声明成指针,已修改,这个一定要注意,先声明一个栈并命名,S1,S2都可以
Initstack(&S1);//构造空栈
while(a)//当a本身即为0时没有输出,考虑过a为负数的情况没?
{
Push(&S1,a%b);//已修改
a=a/b;
}
while(!StackEmpty(&S1))//这里StackEmpty(&S1)函数我定义为int型,为了这里的判断用的,函数代表了返回值
{
Pop(&S1);//
//printf("%d",e);//当基数大于9时输出结果不对。改成printf("%x", i);可以实现16进制内的输出。
//改成printf("%c", (i < 10) i+'0' : i - 10 + 'A');可以实现36进制内的输出
}
}
void main(int argc,char *argv[])
{
int a,b;
printf("please input the data you want to conversion\n");
scanf("%d",&a);
printf("please input the scale you want to convert to\n");
scanf("%d",&b);
conversion(a,b);
}