❶ 用c语言栈实现进制转换,十进制转成2,8,16,2,8,16转成十进制,
Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
#include<stdio.h>
#include<string.h>
int main()
{
int R,a,i;
long n;
char b[10000];
while(scanf("%d %d",&n,&R)!=EOF)
{
if(n==0)
printf("0\n");
if(n==1)
printf("1\n");
if(n==-1)
printf("-1\n");
if(n>1||n<-1)
{
if(n<0)
printf("-");
n=n>0?n:-n;
i=0;
while(n>0)
{
a=n%R;
n=n/R;
if(a>=10)
b[i]='A'+a-10;
else
b[i]='0'+a;
i++;
}
b[i]='\0';
for(i=strlen(b)-1;i>=0;i--)
printf("%c",b[i]);
printf("\n");
}
}
return 0;
}
❷ 求利用栈把一个10进制数转换城16进制数(c语言)的程序
运行示例:
输入:100000
输出:186a0
程序源码如下:
#include
<stdio.h>
#include
<stdlib.h>
#define
MAX
100
int
stack[MAX];
int
top
=
0;
int
push(int
*stack,
int
*top,
int
x)
{
if
(*top
==
MAX)
return
0;
stack[(*top)++]
=
x;
return
1;
}
int
pop(int
*stack,
int
*top,
int
*x)
{
if
(*top
==
0)
return
0;
*x
=
stack[--(*top)];
return
1;
}
int
empty(int
*stack,
int
top)
{
return
top
==
0;
}
int
main()
{
unsigned
num
=
0;
scanf("%u",
&num);
while
(num)
{
push(stack,
&top,
num
%
16);
num
/=
16;
}
if
(empty(stack,
top))
push(stack,
&top,
0);
while
(!empty(stack,
top))
{
int
digit
=
0;
pop(stack,
&top,
&digit);
if
(digit
<
10)
printf("%c",
'0'
+
digit);
else
printf("%c",
'a'
+
(digit
-
10));
}
printf("\n");
return
0;
}
❸ 用C语言写出用数据结构中用栈实现进制间的转换
十进制换二进制,八进制,十六进制 #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LISTINCREMENT 10 #define INFEASIBLE -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int SElemType; typedef int Status; typedef int ElemType; typedef struct SqStack { SElemType *base; SElemType *top; int stacksize; }SqStack; SqStack S; Status InitStack(); Status Push(SElemType e); Status Pop(SElemType *e); Status StackEmpty(); void main() { char *b="0123456789ABCDEF"; int n,N,M,L,e; SqStack S; InitStack(); printf("请输入要转换的数字:"); scanf("%d",&n); N=M=L=n; while(N) { Push(N % 8); N = N / 8; } printf("转换为八进制数为:"); while(!StackEmpty()) { Pop(&e); printf("%d",e); } printf("\n"); while(M) { Push(M % 2); M = M / 2; } printf("转换为二进制数为:"); while(!StackEmpty()) { Pop(&e); printf("%d",e); } printf("\n"); while(L) { Push(L % 16); L = L / 16; } printf("转换为十六进制数为:"); while(!StackEmpty()) { Pop(&e); printf("%c", b[e]); } printf("\n"); getch(); } Status InitStack() { S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status Pop(SElemType *e) { if(S.top == S.base) return ERROR; *e = *--S.top; return OK; } Status Push(SElemType e) { if(S.top - S.base >= S.stacksize) { S.base = (ElemType *)realloc(S.base,(S.stacksize + LISTINCREMENT) * sizeof(ElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status StackEmpty() { if(S.top == S.base) return OK; else return ERROR; }
❹ 数据结构中用C语言写:利用栈实现十进制数 N和其它 d进制数的转换。
工具/材料:以Microsoft Visual Studio 2010为例。
1、首先在桌面上,点击“Microsoft Visual Studio 2010”图标。
❺ 数据结构 栈 进制转换,用C语言描述
#include<stdio.h>
#include<stdlib.h>
#defineOK1
#defineERROR-1
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE50
#defineSTACKINCREMENT10
typedefintSElemType;
typedefintStatus;
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S)
{//构建一个空栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);//存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{if(!S.base)returnERROR;//若栈未建立(尚未分配栈空间)
free(S.base);//回收栈空间
S.base=S.top=NULL;
S.stacksize=0;
returnOK;
}//DetroyStack
StatusPush(SqStack&S,chare)
{//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)returnOVERFLOW;//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}//Push
StatusPop(SqStack&S,char&e)
{//若栈不空,则删除S的栈顶元素
//用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*(--S.top);
returnOK;
}//Pop
Statustwo()
{SElemTypen;chare;
SqStackS;
InitStack(S);//建空栈
printf("请输入一个十进制正整数: ");//该函数未检查是否为正数和整数
scanf("%d",&n);
printf("的2进制是:");
while(n)
{
Push(S,n%2);//N/2余数进栈
n=n/2;//整除运算
}
while(S.top!=S.base){
Pop(S,e);
printf("%d",e);
}
printf(" ");
DestroyStack(S);
}
Statuseight()
{SElemTypen;chare;
SqStackS;
InitStack(S);//建空栈
printf("请输入一个十进制正整数: ");
scanf("%d",&n);
printf("的8进制是:");
while(n)
{
Push(S,n%8);//N/8余数进栈
n=n/8;//整除运算
}
while(S.top!=S.base){
Pop(S,e);
printf("%d",e);
}
printf(" ");
DestroyStack(S);
}
Statussixteen()
{SElemTypen;chare;
SqStackS;
InitStack(S);//建空栈
printf("请输入一个十进制正整数: ");
scanf("%d",&n);
printf("的16进制是:");
while(n)
{e=n%16;
If(e==0)e='0';
if(e==1)e='1';
if(e==2)e='2';
if(e==3)e='3';
if(e==4)e='4';
if(e==5)e='5';
if(e==6)e='6';
if(e==7)e='7';
if(e==8)e='8';
if(e==9)e='9';
if(e==10)e='A';
if(e==11)e='B';
if(e==12)e='C';
if(e==13)e='D';
if(e==14)e='E';
if(e==15)e='F';
Push(S,e);//N/16余数进栈
n=n/16;//整除运算
}
while(S.top!=S.base){
Pop(S,e);
printf("%s",&e);
}
printf(" ");
DestroyStack(S);
}
intmain()
{intflag;
intselect;
printf("主菜单 ");
printf("1.2进制 ");
printf("2.8进制 ");
printf("3.16进制 ");
printf("4.退出 ");
while(flag)
{printf("请选择:");
scanf("%d",&select);
switch(select)
{
case1:
two();
break;
case2:
eight();
break;
case3:
sixteen();
break;
case4:
flag=0;
break;
}
}
}
❻ C语言 利用栈实现不同进制数之间的转换。要求输入一个十进制整数N,通过堆栈实现十进制整数到二进制数
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#defineelemTypeint /*链栈元素数据类型*/
#defineSNODE_SIZEsizeof(structsNode) /*链栈结点空间大小*/
#definestatusint /*状态型变量*/
#defineOVERFLOW-1 /*内存溢出状态码*/
#defineERROR0 /*错误状态码*/
#defineOK1 /*正确状态码*/
/*链栈结点存储结构*/
typedefstructsNode{
elemTypedata;
structsNode*next;
}sNode,*sNodePtr;
/*链栈存储结构*/
typedefstructlinkStack{
sNodePtrtop;/*栈顶指针*/
}linkStack;
/*初始化*/
/*操作结果:构造一个带头结点的空链栈S*/
voidinitStack(linkStack*S){
S->top=(sNodePtr)malloc(SNODE_SIZE);/*产生头结点,栈顶指针指向此头结点*/
if(!S->top)/*内存分配失败*/
exit(OVERFLOW);
S->top->next=NULL;
}
/*销毁*/
/*初始条件:链栈S已存在。操作结果:销毁链栈S*/
voiddestroyStack(linkStack*S){
sNodePtrp,q;
p=S->top;/*p指向S的头结点*/
while(p){
q=p->next;/*q指向p的下一个结点*/
free(p);/*回收p指向的结点*/
p=q;/*p移动到下一个结点*/
}/*直到没有下一个结点*/
}
/*判断链栈是否为空*/
/*初始条件:链栈S已存在。操作结果:若S为空链栈,则返回TRUE,否则返回FALSE*/
statusstackIsEmpty(linkStack*S){
returnS->top->next==NULL;
}
/*入栈*/
/*操作结果:在S的栈顶插入新的元素e*/
statuspush(linkStack*S,elemTypee){
sNodePtrp;
p=(sNodePtr)malloc(SNODE_SIZE);/*产生新结点*/
if(!p)/*内存分配失败*/
exit(OVERFLOW);
p->data=e;
p->next=S->top->next;/*将新结点链接到原栈顶*/
S->top->next=p;/*栈顶指向新结点*/
}
/*出栈*/
/*操作结果:删除S的栈顶元素,并由e返回其值*/
statuspop(linkStack*S,elemType*e){
sNodePtrp;
if(stackIsEmpty(S))
returnERROR;
p=S->top->next;/*p指向链栈的第一个结点*/
*e=p->data;/*取出数据*/
S->top->next=p->next;
free(p);/*删除该结点*/
if(S->top==p)/*栈为空*/
S->top->next=NULL;
returnOK;
}
intmain(void){
linkStackS;
elemTypee;
intN;
initStack(&S);
scanf("%d",&N);
/*除基数取余*/
while(N){
push(&S,N%2);
N/=2;
}
while(!stackIsEmpty(&S)){
pop(&S,&e);
printf("%d",e);
}
destroyStack(&S);
getch();/*屏幕暂留*/
return0;
}
如有问题,点击头像联系我
❼ C语言中的栈实现进制转换
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int DataType;
typedef struct{
DataType data[MAXSIZE];
int top;
}SeqStack,*PSeqStack;
PSeqStack Init_SeqStack(void)
{
PSeqStack S;
S=(PSeqStack)malloc(sizeof(SeqStack));
if(S)
S->top=-1;
return S;
}
int Push_SeqStack(PSeqStack S,DataType x)
{
if (S->top==MAXSIZE-1)
return 0;
else
{
S->top++;
S->data[S->top]=x;
return 1;
}
}
int Empty_SeqStack(PSeqStack S)
{
if(S->top==-1)
return 1;
else
return 0;
}
int Pop_SeqStack(PSeqStack S,DataType *x)
{
if(Empty_SeqStack(S))
return 0;
else
{
*x=S->data[S->top];
S->top--;
return -1;
}
}
void Destory_SeqStack(PSeqStack *S)
{
if(*S)
free(*S);
*S=NULL;
return;
}
typedef int DataType;
int conversation(int n,int r)
{
PSeqStack S;
DataType x;
if(!r)
{
printf("基数不能为0");
return(0);
}
S=Init_SeqStack();
if(!S)
{
printf("栈初始化失败");
return(0);
}
while(n)
{
Push_SeqStack(S,n%r);
n=n/r;
}
while (!Empty_SeqStack(S))
{
Pop_SeqStack(S,&x);
printf("%d",x);
}
Destory_SeqStack(&S);
return 0;
}
void main()
{
int i,a;
printf("输入要转换的进制!!\n");
scanf("%d",&a);
printf("输入要转换的数!!\n");
scanf("%d",&i);
conversation(i,a);
}
❽ 用C语言实现栈的基本操作(数制的转换)
//顺序栈以及基本操作如下:
#include<iostream.h>
enum
{
MAX_SIZE=20
};
typedef struct
{
int* base;
int* top;
int stacksize;
}SqStack;
void InitStack(SqStack& S)
{
S.base=new int[MAX_SIZE];
S.top=S.base;
S.stacksize=MAX_SIZE;
}
bool Push(SqStack& S,int e)
{
if(S.top-S.base>=S.stacksize)
return false;
*S.top=e;
S.top++;
return true;
}
bool Pop(SqStack& S,int& e)
{
if(S.top==S.base)
return false;
S.top--;
e=*S.top;
return true;
}
void DestroyStack(SqStack& S)
{
if(S.base)
delete S.base;
S.top=S.base=NULL;
S.stacksize=0;
}
bool StackEmpty(SqStack S)
{
return (S.top==S.base);
}
void Print(SqStack S)
{
int i=0;
while(i<S.top-S.base)
{
cout<<S.base[i++]<<endl;
}
}
❾ C语言数据结构用栈写的进制转换~~~
我试过了,不是无法运行,是运行时出错。你现在要单步调试,仔细检查每一个指针和变量的值。练习单步调试运行时错误是提高你编程技术的好机会,直接答案你就失去了这个机会了。
建议:你的编程习惯不好,你应该给程序加上必要的调试信息,比如像这样的:(多敲几下键盘而已)
#ifdef _DEBUG
printf("Function:%s, Line: %d\n", __FUNCTION__, __LINE__); //若是gcc编译器,请用__func__
#endif
这两个都是系统默认的变量,__FUNCTION__是当前运行的函数, __LINE__是当前运行的行数
至少加在每个函数的开头,这样运行的时候就会告诉你这个程序在哪个函数的第几行出错了。
提示:我在pushstock函数里加了2个printf,运行的时候只打出来一个,现在知道错误在哪里了把?
Status pushstock( SqStack &S, int num )
{
#ifdef _DEBUG
printf("Function:%s, Line: %d\n", __FUNCTION__, __LINE__); //若是gcc编译器,请用__func__
#endif
if( S.top - S.base >= S.stocksize )
{
S.base = ( SElemType * )realloc( S.base,
sizeof(SElemType) * (STOCKINCREASE + S.stocksize) );
if( !S.base )
exit( 0 );
S.top = S.base + S.stocksize;
S.stocksize += STOCKINCREASE;
}
#ifdef _DEBUG
printf("Function:%s, Line: %d\n", __FUNCTION__, __LINE__); //若是gcc编译器,请用__func__
#endif
* (S.top++) = num;
return OK;
}