清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#include<stdio.h>
#include<stdlib.h>
typedef int SElemType ;
unsigned n;//非负整数
int N;
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define STACKINCREMENT 1
#define STACK_INIT_SIZE 10
typedef int Status;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//此处需引入顺序栈存储结构及其基本操作
Status InitStack(SqStack &S)
{
//为栈分配一个指定大小的存储空间
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
return ERROR;//存储分配失败
S.top=S.base;//栈底与栈顶相同表示一个空栈
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status StackEmpty(SqStack S)
{
//若栈S为空栈(栈顶与栈底相同),则返回OK,否则返回ERROR
if(S.top==S.base)
return OK;
else
return ERROR;
}
Status Push(SqStack &S,SElemType e)
{
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//这个等式的++*优先级相同,但是它们的运算方式,是自右向左
return OK;
}
Status GetTop(SqStack S,SElemType *e)
{
if(S.base<S.top)
{
*e=*(S.top-1);
return OK;
}
else return ERROR;
}
Status Pop(SqStack &S,SElemType &b)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base)
return ERROR;
b = * --S.top;//这个等式的--*优先级相同,但是它们的运算方式,是自右向左
return OK;
}
Status StackTraverse(SqStack S,int(*visit)(SElemType))
{
while(S.top>S.base)
{
visit(*S.base);
S.base++;
}
printf("\n");
return OK;
}
Status visit(SElemType c)
{
printf("%d", c);
return OK;
}
void conversion()
{
//对于输入任意一个非负十进制整数,打印输出与其等值的N进制数
SqStack s;
SElemType e;
InitStack(s);//初始化栈
while(n)//当n不等于0
{
Push(s,n%N);//压入n除以N的余数(N进制的低位)
n=n/N;
}
printf("转换后的数值为:");
while(!StackEmpty(s))
{
Pop(s,e);//弹出栈顶元素且赋值给e
printf("%d",e);
}
printf("\n");
}
void main()
{
int y;
char c;
printf(" 1.输入一个十进制数n\n 2.输入转换的进制m\n 3.进制转换 \n 4.继续否?(y/n?)\n");
while(1)
{
printf("请选择1-4\n");
scanf("%d",&y);
if(y==1)
{
printf("输入一个十进制数\n");
scanf("%d", &n);
}else
if(y==2)
{
printf("输入转换的进制\n");
scanf("%d", &N);
}else
if(y==3)
{
printf("进制转换\n");
conversion();
}else
if(y==4)
{
printf("请输入y or Y to continue or n or N to quit\n");
scanf("%c",&c);
if(c == 'n' || c == 'N')
break;
}
else
{
printf("无效字符\n");
}
}
}