数据结构 运用链栈实现10进制到8进制和16进制的转换运用堆栈实现逆波兰表达式源程序
栈的应用-数制转换(C语言数据结构)
栈的应⽤-数制转换(C语⾔数据结构)
数制转换
在计算机中经常⾯对不同数制的转换问题,如将⼀个⼗进制数N转换为d进制B。数制转换的解决⽅法很多,其中⼀个简单的转换算法是重复
下述两步。直到N等于零为⽌。
x = N mod d
N = N div d
其中,N为需要转换的⼗进制数,d为转换后的进制,x值为转换后各个数位上的数,div为整除运算,mod为求余运算。算法的运⾏过程为:
第⼀次求出的x值为d进制数的最低位,最后⼀次求出的x值为d进制数的最⾼位,所以上述算法是从低位到⾼位顺序产⽣d进制的各位,然后
逆序输出,因为它按“后进先出”的规律进⾏的,所以⽤栈这种结构处理最合适。根据这个特点,利⽤栈来实现上述数制转换,即将计算过程
种⼀次得到的d进制数码按顺序栈进栈。计算结束后,再返顺序出栈,并按出栈顺序打印输出。这样即可得到给定的⼗进制数对应的d进制
数,由此可以得到数制转换的算法。
实现代码
利⽤顺序栈实现数制转换(以⼗进制转换为⼆进制为例)
1 #include
2 #include
3 #define MAXSIZE 1024
4
5 /*定义顺序栈*/
6 typedef int elemtype;
7 typedef struct SequenStack
8 {
9 elemtype data[MAXSIZE];
10 int top;
11 }SequenStack;
12
13 /*判(顺序栈)栈空*/
14 SequenStack * Init_SequenStack()
15 {
16 SequenStack * S;
17 S = (SequenStack *)malloc(sizeof(SequenStack));
18
19 if (S == NULL)
20 {
21 return S;
22 }
23 S->top = -1;
24 return S;
25 }
26
27 /* 判空栈(顺序栈)*/
28 int SequenStack_Empty(SequenStack * S)
《栈的应用_版本1.1(实现了如何十进制转十六进制)》
《栈的应⽤_版本1.1(实现了如何⼗进制转⼗六进制)》
/*
栈的应⽤:1:需求:对于输⼊的任意⼀个⾮负⼗进制整数,打印输出与其等值的d进制数
2:思路:利⽤动态栈的后进先出的特性.
3: 步骤:
4:⼼得与体会:
(1):这两天⼀直在想⼀个问题,如何才能实现动态栈中的元素依次输出打印出来呢?
解决的办法就是:先定义⼀个整形变量len,让len的初值为栈的长度(len = StackLength(s)),再⽤⼀个for循环
然后利⽤出栈操作函数Pop(SqStack &s,SElemType &e),依次输出动态栈中的数据元素.(2):如何打印输出⼗六进制数的问题,在输出之前有⼀个case语句进⾏判断。
5:尚未解决的问题:
(1):如何实现带⼩数的⼗进制转换为⼆,⼋,⼗六进制。
*/
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OvERFLOW -2
#define STACK_INIT_SIZE 100 //栈当前可使⽤的最⼤容量
#define STACKINCREMENT 10 //存储空间分配增量
typedef int Status; //函数结果状态类型
typedef int SElemType; //数据类型
typedef struct
{
SElemType *top;
SElemType *base;
int stacksize;
}SqStack;
//定义InitStack函数,创建⼀个空栈
Status InitStack(SqStack &s)
{
s.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s.base) exit(OvERFLOW);
s.top = s.base;
栈的进制转换
一、实验目的
掌握栈的基本用法
二、实验准备
计算机 VC++6.0 Win7
三、实验内容
1、利用栈实现一个十进制数转换为二进制数和十六进制数。
程序:
#include
#include
#include
#define STACKSIZE 100
#define ADD 10
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;
bool Initstack(sqstack &L)
{ //构造一个空栈
L.base=(int *)malloc(STACKSIZE * sizeof(int));
if(!L.base)
exit(1);
L.top=L.base;//空栈的标志
L.stacksize=STACKSIZE;
return true;}
bool Push(sqstack &L,int e)
{
if(L.top - L.base>=L.stacksize)
{ //栈满,的申请新的空间
L.base=(int *)realloc(L.base,(L.stacksize+ADD) *sizeof(int)); //生成新节点
if(!L.base)
return false;
L.top=L.base+L.stacksize; //新基址
L.stacksize+=ADD;
}
*L.top++=e;
return true;
}
bool GetTop(sqstack L,int &e)
{ //用e返回栈顶元素
if(L.base==L.top)
return false;
e=*(L.top-1);
return true; }
数据结构实验2数制转换
实验二、数制转换
一、实验目的
1.掌握堆栈的存储方式和基本操作。
2.掌握堆栈后进先出运算原则在解决实际问题中的应用。
3.掌握使用栈的原理来解决数制转换问题。
二、实验内容
利用栈结构,编写程序将十进制数转换成二进制数或八进制数。
提示:十进制数值转换成二进制使用辗转相除法将一个十进制数值转换成二进制数值。即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的二进制数值。十进制数值转换成八进制算法类似。转换算法要求用一个函数完成。
顺序栈的基本操作的代码可参考如下:
typedef struct
{
DataType stack[MaxStackSize];
int top;
} SeqStack;
void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/
{ S->top = 0; /*定义初始栈顶下标值*/
}
int StackNotEmpty(SeqStack S)
/*判顺序堆栈S非空否,非空则返回1,否则返回0*/
{ if(S.top <= 0) return 0;
else return 1;
}
int StackPush(SeqStack *S, DataType x)
/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */
{ if(S->top >= MaxStackSize)
{ printf("堆栈已满无法插入! \n");
return 0;
}
else
{ S->stack[S->top] = x;
S->top ++;
链栈与进制转换
数据结构之链栈与进栈转换
#include "LinkStack.h"
#include
using namespace std;
LinkStack::LinkStack()
{
head=new Node;
head->next=NULL;
length=0;
top=head->next;
}
void LinkStack::StackOut(void)
{
if(0==length)
{
cout<<"当前栈为空。"<
}
else
{
cout<<"当前栈长度为:"<
cout<<"当前栈内容为:";
Node *temp=head->next;
for(int i=1;i<=length;i++)
{
cout temp=temp->next; } cout< } } void LinkStack::Push(int value) { Node * S=new Node; S->data=value; S->next=top; head->next=S; length++; top=S; } int LinkStack::Pop(int& value) { if(0==length) return -1; value=top->data; head->next=top->next; delete top; top=head->next; length--; return 0; } void Convert(void)//进制转换 { int num; cout<<"请输入一个正整数:"; cin>>num; int radix; cout<<"请输入一个大于1的正整数:"; cin>>radix; //转换 LinkStack dataStack; while(num>0)
十进制转换 数据结构
十进制转换 数据结构
一、什么是十进制转换
1.1 十进制的定义
1.2 为什么需要十进制转换
1.3 十进制转换的应用场景
二、常见的十进制转换方法
2.1 二进制转换
2.1.1 二进制转换为十进制
2.1.2 十进制转换为二进制
2.2 八进制转换
2.2.1 八进制转换为十进制
2.2.2 十进制转换为八进制
2.3 十六进制转换
2.3.1 十六进制转换为十进制
2.3.2 十进制转换为十六进制
三、数据结构与十进制转换
3.1 栈的应用
3.1.1 栈的基本概念
3.1.2 栈在十进制转换中的应用
3.2 队列的应用
3.2.1 队列的基本概念
3.2.2 队列在十进制转换中的应用
四、算法实现
4.1 逐位相除法 4.1.1 算法思想
4.1.2 逐位相除法的步骤
4.2 移位法
4.2.1 算法思想
4.2.2 移位法的步骤
五、实例分析
5.1 二进制转换为十进制的实例
5.2 十进制转换为二进制的实例
5.3 八进制转换为十进制的实例
5.4 十进制转换为八进制的实例
5.5 十六进制转换为十进制的实例
5.6 十进制转换为十六进制的实例
六、总结
6.1 十进制转换的重要性
6.2 常见的十进制转换方法总结
6.3 数据结构在十进制转换中的作用
6.4 算法实现的优缺点分析
七、参考文献
以上是关于十进制转换数据结构的详细探讨,从基本概念、常见方法、数据结构应用到算法实现和实例分析,全面介绍了十进制转换的相关知识。通过深入理解和掌握这些内容,可以更好地应用于实际问题中。希望本文对读者在学习和应用十进制转换方面有所帮助。
十进制转换为八进制
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct stack
{int *base;
int *top;
int length;
}
stack;
stack S;
int initstack()
{
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base)
exit(-1);
S.top=S.base;
S.length=STACK_INIT_SIZE;
return 1;
}
int stackempty()
{
if (S.top==S.base)
return 1;
else
return 0;
}
int push(int r)
{
if(S.top-S.base>=STACK_INIT_SIZE) //栈满 追加存储空间
{
S.base=(int *) realloc(S.base,(S.length+STACKINCREMENT)*sizeof(int));
if (!S.base)
exit(-1);
S.top=S.base+S.length;
S.length+=STACKINCREMENT;
}
*S.top++ =r;
return 1;
}
int pop(int *r){
if(S.top==S.base) {
printf("emptyt stack\n");
return 0;
}
*r=*--S.top;
return 1;
}
int main()
{
stack S;
int n,m;
initstack();
10进制转换成8进制c语言
10进制转换成8进制c语言
一、概述
在计算机科学中,数字的进制转换是一个非常基础的概念。在实际编程中,经常需要进行不同进制之间的转换。本文将介绍如何将10进制转换成8进制,并提供C语言代码实现。
二、10进制转换成8进制的方法
将10进制数转换成8进制数的方法是:先将10进制数除以8,得到商和余数。再将商除以8,得到新的商和余数。直到商为0为止,最后把余数倒序排列起来就是对应的8进制数。
举个例子:
我们要把十进制数 123 转换成八进制数,按照上述方法进行计算:
- 123÷8=15···3(商为15,余数为3)
- 15÷8=1···7(商为1,余数为7)
- 1÷8=0···1(商为0,余数为1)
所以十进制数 123 转换成八进制数就是 173。
三、C语言代码实现
下面给出C语言代码实现:
```c
#include
int main()
{
int decimal, octal = 0, i = 1;
printf("Enter a decimal number: ");
scanf("%d", &decimal);
while (decimal != 0)
{
octal += (decimal % 8) * i;
decimal /= 8;
i *= 10;
}
printf("Octal number is: %d", octal);
return 0;
}
```
代码解释:
- 首先定义了两个整型变量 decimal 和 octal,分别用来存储输入的十进制数和转换后的八进制数;
- 然后使用 printf 函数提示用户输入一个十进制数,并使用 scanf 函数读入该数;
- 接着使用 while 循环将十进制数转换成八进制数,具体实现方法见上述“二、10进制转换成8进制的方法”;
数据结构C语言实现之数制转换
数据结构C语言实现之数制转换
数制转换是计算机科学中的一个重要主题,它涉及将一个数从一种数制表示转换为另一种数制表示。数制是指用来表示数字的系统,常见的数制包括十进制、二进制、八进制和十六进制。
在计算机中,常用的数制是二进制,因为计算机中所有数据都以二进制形式存储和处理。但是,人们更习惯于使用十进制数制,因此在计算机科学中,经常需要进行不同数制之间的转换。
数制转换涉及到的几种常见数制是二进制、八进制和十六进制,因此本篇文章将主要介绍如何实现这三种数制之间的相互转换。
一、二进制转换为十进制:
二进制数是由0和1组成的数,它与十进制数的转换相对简单。我们只需要将二进制数从右至左依次乘以2的幂次方,然后将它们相加得到十进制数。
下面是C语言实现二进制转换为十进制的代码:
```c
#include
#include
int binaryToDecimal(long long n)
int decimal = 0, i = 0, remainder;
while (n != 0) remainder = n % 10;
n/=10;
decimal += remainder * pow(2, i); // pow函数用于计算一个数的幂次方
++i;
}
return decimal;
int mai
long long n;
printf("Enter a binary number: ");
scanf("%lld", &n);
printf("Decimal number: %d\n", binaryToDecimal(n));
return 0;
```
二、十进制转换为二进制:
十进制转换为二进制相对复杂一些,我们需要将十进制数除以2,然后将得到的商再次除以2,依此类推,直到商为0为止。最后将所有的余数倒序排列,即可得到所求的二进制数。
下面是C语言实现十进制转换为二进制的代码:
```c #include
链式栈实现数制转换
链式栈实现数制转换
#include
#include
using namespace std;
typedef int SElemType;
typedef struct node //链式栈定义
{
SElemType data;
struct node* link;
}LinkNode,* LinkStack;
int Pop(LinkStack& S,SElemType& x) //退栈
{
if(S->link==NULL) return 0;
LinkNode* p=S->link;
S->link=p->link;
x=p->data; delete p;
return 1;
};
void Push(LinkStack& S,SElemType x) //进栈
{
LinkNode* p=new LinkNode;
if(!p)
{
cerr<<"存储分配失败!\n";exit(1);
}
p->data=x;
p->link=S->link;S->link=p;
};
void InitStack(LinkStack& S) //链式栈初始化
{
S=new LinkNode;
if(!S)
{
cerr<<"存储分配失败!\n";exit(1);
}
S->link=NULL;
};
int StackEmpty(LinkStack& S) //链式栈是否为空
{
return S->link==NULL;
};
int main()
{ //辗转除k取余法将⼗进制转为k进制
int N,k,d;
cout<<"请输⼊⼀个⾮负整数";cin>>N;
cout<<"要转换多少进制数?2,8,16:" ; cin>>k;
LinkStack S;InitStack(S);
while(N>0)
{
Push(S,N% k); N=N/k;
}
while(!StackEmpty(S))
{
Pop(S,d);cout<
