数制转换(栈的应用)
java:数据结构(二)栈的应用(进制转换全收集)
java:数据结构(⼆)栈的应⽤(进制转换全收集)说到进制转换,java已经封装了基本的⽅法,在竞赛中使⽤封装的⽅法⾃然能节省⼤量时间另⼀位仁兄介绍的封装好的⽅法:https:///m0_37961948/article/details/80438113如果不想看上⾯的全部,我总结了两条基本⽅放,记下就可以随意转化:掌握这两个⽅法就可以实现任意进制的随便转化(这个是针对竞赛,如果是需要学习底层,⼤家还在看api研究吧)再看⼀个⽔题:题⽬描述写出⼀个程序,接受⼀个⼗六进制的数值字符串,输出该数值的⼗进制字符串。
(多组同时输⼊)输⼊描述:输⼊⼀个⼗六进制的数值字符串。
输出描述:输出该数值的⼗进制字符串。
⽰例1输⼊0xA输出10由于本题⽬简单,所以只给出代码:1import java.util.Scanner;2import java.util.*;34public class Main{5public static void main(String args[]){6 Scanner in = new Scanner(System.in);7while (in.hasNext()) {8 String a=in.next();9char[] p=a.toCharArray();10 a=String.valueOf(Arrays.copyOfRange(p,2,p.length));11 System.out.println(Integer.parseInt(a, 16));12 }13 }14 }后⾯就是靠栈实现任意进制不使⽤已经封装好的⽅法:(栈使⽤的是我⾃⼰写的)1/**2 * 进制转换3 * 算法设计:先将其他进制统⼀转为10进制,再利⽤取余法4 * 将10进制转为其他进制5 * @param n 需要转化的数6 * @param n1 需要转化数的进制7 * @param n2 转化后的进制8 * @return转换后的数9*/10static String systemTransformation(String n, int n1, int n2) {11 MyArraysStack<Character> e=new MyArraysStack<Character>();12char[] a=new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};13char[] b=n.toCharArray();14int bNumber=0,t=0;15//[start]将n1进制转为10进制16for (char p:b){17 e.push(p);18 }19while (!e.isEmpty()){20char temp=e.pop();21 bNumber+= Arrays.binarySearch(a,temp)*Math.pow(n1,t);22 t++;23 }24//[end]25//[start] 将10进制转为n2进制26 StringBuilder builder=new StringBuilder();27while (bNumber>0){28 e.push(a[bNumber%n2]);29 bNumber/=n2;30 }31while (!e.isEmpty()) {32 builder.append(e.pop());33 }34//[end]35 String str;36 str=builder.toString();37return str;38 }* 算法设计:先将其他进制统⼀转为10进制,再利⽤取余法* 将10进制转为其他进制* 最⾼到16进制向其他任意⼀进制转化* 如果需要更⼤的进制则需要扩充a数组即可当你觉得⾃⼰在进制转换上已经完全ok了,此时我⼜遇到了⼀道有趣的题⽬:题⽬描述输⼊两个整数,求两个整数⼆进制格式有多少个位不同输⼊描述:两个整数输出描述:⼆进制不同位的个数⽰例1输⼊22 33输出5⼀看到这道题我⾸先想到,先将两个数转为⼆进制,然后循环⽐对出值(突然感到⼗分⿇烦)然后⼀看讨论发现了骚操作:使⽤异或:1public class Solution {2/**3 * 获得两个整形⼆进制表达位数不同的数量4 *5 * @param m 整数m6 * @param n 整数n7 * @return整型8*/9public int countBitDiff(int m, int n) {10 String str=Integer.toBinaryString(m^n);11 str=str.replaceAll("0","");12return str.length();13 }14 } 异或就是不同为1,相同为0,将m和n异或,是位运算,m^n的结果是m和n⼆进制的异或结果 Integer.toBinaryString();将m^n转为⼆进制 然后替换了字符串⾥⾯的0,返回字符串长度,即得到了不同的位数。
C语言【栈的应用数制转换】
C语⾔【栈的应⽤数制转换】1 #include <stdio.h>2 #include <malloc.h>3 #include <process.h>4#define OK 15#define STACK_INIT_SIZE 56#define STACKINCREMENT 57 typedef int ElemType;89 typedef struct10 {1112 ElemType *base;13 ElemType *top;14int stacksize;15 }SqStack;16void InitStack(SqStack *S)17 {18 S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); //分配内存19if(!S->base) //如果为空,则退出20 exit(1);21 S->top=S->base;22 S->stacksize=STACK_INIT_SIZE;23 }24int push(SqStack *S,ElemType e)/*顺序⼊栈*/25 {26if(S->top-S->base>S->stacksize)//栈中的数据长度⼤于给定分配⼤⼩27 {28 S->base=(ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));//增加内存⼤⼩29if(!S->base)30 exit(1);31 S->top=S->base+S->stacksize;//将增加的长度给更新32 S->stacksize+=STACKINCREMENT;//更新增加后的长度33 }34 *S->top=e;35 S->top++;36return1;3738 }39 ElemType pop(SqStack *S,ElemType *e)/*顺序出栈*/40 {41if(S->top==S->base) //出栈判断栈是否是空42 printf("此时栈为空,不能出栈!\n");43 *e=*--S->top;44return *e;45 }46int StackEmpty(SqStack *S)/*判断顺序栈是否为空*/47 {48if(S->top==S->base)49return1;50else51return0;5253 }54void DestroyStack(SqStack *S)/*顺序栈销毁*/55 {56 free(S->top);57 }5859void Conversion()/*数值转换*/60 {61int n;62int m;63 SqStack s;64 ElemType e;65 InitStack(&s);66 printf("请输⼊带转换的数值:\n");67 scanf("%d",&n);68 printf("请输⼊要转化的数制:\n");69 scanf("%d",&m);70while(n)71 {72 push(&s,n%m);73 n=n/m;74 }75while(!StackEmpty(&s))76 {77 pop(&s,&e);78 printf("%d",e);7981 printf("\n");82 DestroyStack(&s);8384 }85int main(void) /*程序⼊⼝*/86 {87 Conversion();88return OK;89 }1 #include <stdio.h>2 #include <malloc.h>3 #include <process.h>4#define OK 15#define STACK_INIT_SIZE 56#define STACKINCREMENT 57 typedef int ElemType;89 typedef struct10 {1112 ElemType *base;13 ElemType *top;14int stacksize;15 }SqStack;16void InitStack(SqStack *S)17 {18 S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); //分配内存19if(!S->base) //如果为空,则退出20 exit(1);21 S->top=S->base;22 S->stacksize=STACK_INIT_SIZE;23 }24int push(SqStack *S,ElemType e)/*顺序⼊栈*/25 {26if(S->top-S->base>S->stacksize)//栈中的数据长度⼤于给定分配⼤⼩27 {28 S->base=(ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));//增加内存⼤⼩29if(!S->base)30 exit(1);31 S->top=S->base+S->stacksize;//将增加的长度给更新32 S->stacksize+=STACKINCREMENT;//更新增加后的长度33 }34 *S->top=e;35 S->top++;36return1;3738 }39 ElemType pop(SqStack *S,ElemType *e)/*顺序出栈*/40 {41if(S->top==S->base) //出栈判断栈是否是空42 printf("此时栈为空,不能出栈!\n");43 *e=*--S->top;44return *e;45 }46int StackEmpty(SqStack *S)/*判断顺序栈是否为空*/47 {48if(S->top==S->base)49return1;50else51return0;5253 }54void DestroyStack(SqStack *S)/*顺序栈销毁*/55 {56 free(S->top);57 }5859void Conversion()/*数值转换*/60 {61int n;62int m;63 SqStack s;64 ElemType e;65 InitStack(&s);66 printf("请输⼊带转换的数值:\n");67 scanf("%d",&n);68 printf("请输⼊要转化的数制:\n");69 scanf("%d",&m);70while(n)71 {72 push(&s,n%m);73 n=n/m;75while(!StackEmpty(&s))76 {77 pop(&s,&e);78 printf("%d",e);7980 }81 printf("\n");82 DestroyStack(&s);8384 }85int main(void) /*程序⼊⼝*/86 {87 Conversion();88return OK;89 }。
栈的应用-数制转换(C语言数据结构)
栈的应⽤-数制转换(C语⾔数据结构)数制转换在计算机中经常⾯对不同数制的转换问题,如将⼀个⼗进制数N转换为d进制B。
数制转换的解决⽅法很多,其中⼀个简单的转换算法是重复下述两步。
直到N等于零为⽌。
x = N mod dN = N div d其中,N为需要转换的⼗进制数,d为转换后的进制,x值为转换后各个数位上的数,div为整除运算,mod为求余运算。
算法的运⾏过程为:第⼀次求出的x值为d进制数的最低位,最后⼀次求出的x值为d进制数的最⾼位,所以上述算法是从低位到⾼位顺序产⽣d进制的各位,然后逆序输出,因为它按“后进先出”的规律进⾏的,所以⽤栈这种结构处理最合适。
根据这个特点,利⽤栈来实现上述数制转换,即将计算过程种⼀次得到的d进制数码按顺序栈进栈。
计算结束后,再返顺序出栈,并按出栈顺序打印输出。
这样即可得到给定的⼗进制数对应的d进制数,由此可以得到数制转换的算法。
实现代码利⽤顺序栈实现数制转换(以⼗进制转换为⼆进制为例)1 #include <stdlib.h>2 #include <stdio.h>3 #define MAXSIZE 102445 /*定义顺序栈*/6 typedef int elemtype;7 typedef struct SequenStack8 {9 elemtype data[MAXSIZE];10 int top;11 }SequenStack;1213 /*判(顺序栈)栈空*/14 SequenStack * Init_SequenStack()15 {16 SequenStack * S;17 S = (SequenStack *)malloc(sizeof(SequenStack));1819 if (S == NULL)20 {21 return S;22 }23 S->top = -1;24 return S;25 }2627 /* 判空栈(顺序栈)*/28 int SequenStack_Empty(SequenStack * S)29 {30 if (S->top == -1)31 {32 return 1;33 }34 else35 {36 return 0;37 }38 }3940 /* ⼊栈(顺序栈) */41 int Push_SequenStack(SequenStack * S, elemtype x)42 {43 if (S->top >= MAXSIZE-1)44 {45 return 0;46 }47 S->top++;48 S->data[S->top] = x;49 return 1;50 }5152 /* 出栈(顺序栈) */53 int Pop_SequenStack(SequenStack * S, elemtype * x)54 {55 if (S->top == -1)56 {57 return 0;58 }59 else60 {61 S->top--;62 *x = S->data[S->top+1];63 return 1;64 }65 }6667 /* 进制转换算法 */68 void SequenStackConversion(int N)69 {70 int x;71 SequenStack * S = Init_SequenStack();72 while (N > 0)73 {74 Push_SequenStack(S, N % 2);75 N = N / 2;76 }77 while (! SequenStack_Empty(S))78 {79 Pop_SequenStack(S, &x);80 printf("%d", x);81 }82 }8384 int main()85 {86 int N;87 printf("Please enter the decimal number you want want to convert:\n");88 scanf("%d", &N);89 printf("The converted binary number is:\n");90 SequenStackConversion(N);91 }实现结果:利⽤链栈栈实现数制转换(以⼗进制转换为⼆进制为例)1 #include <stdio.h>2 #include <stdlib.h>34 /*定义链栈*/5 typedef int elemtype;6 typedef struct LinkedStackNode7 {8 elemtype data;9 struct LinkedStackNode *next;10 }LinkedStackNode, *LinkedStack;11 LinkedStack top;1213 /*链栈的初始化*/14 LinkedStack Init_LinkedStack()15 {16 LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));1718 if(top != NULL)19 {20 top->next = NULL;21 }22 return top;23 }2425 /*判栈空*/26 int LinkedStack_Empty(LinkedStack top)27 {28 if (top->next == NULL)29 {30 return 1;31 }32 else33 {34 return 0;35 }3637 }3839 /*⼊栈*/40 int Push_LinkedStack(LinkedStack top, elemtype x)41 {42 LinkedStackNode *node;43 node = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));4445 if (node == NULL)46 {47 return 0;48 }49 else50 {51 node->data = x;52 node->next = top->next;53 top->next = node;54 return 1;55 }5657 }5859 /*出栈*/60 int Pop_LinkedStack(LinkedStack top, elemtype * x)61 {62 LinkedStackNode *node;63 if (top->next == NULL)64 {65 return 0;66 }67 else68 {69 node = top->next;70 *x = node->data;71 top->next = node->next;72 free(node);73 return 1;74 }7576 }7778 /*进制转换*/79 void ListStackConversion(int N)80 {81 int x;82 LinkedStack S = Init_LinkedStack();83 while (N > 0)84 {85 Push_LinkedStack(S, N % 2);86 N = N / 2;87 }88 while (! LinkedStack_Empty(S))89 {90 Pop_LinkedStack(S, &x);91 printf("%d", x);92 }9394 }9596 int main()97 {98 int N;99 printf("Please enter the decimal number you want want to convert:\n"); 100 scanf("%d", &N);101 printf("The converted binary number is:\n");102 ListStackConversion(N);103 }实现结果:把顺序栈和链栈两种功能综合在⼀起实现数制转换(以⼗进制转换为⼗六进制为例)1 /* 进制转换 */2 #include <stdlib.h>3 #include <stdio.h>4 #define MAXSIZE 100 /*定义顺序栈的长度*/56 /*定义顺序栈*/7 typedef int elemtype;8 typedef struct SequenStack9 {10 elemtype data[MAXSIZE];11 int top;12 }SequenStack;1314 /*定义链栈*/15 typedef int elemtype;16 typedef struct LinkedStackNode17 {18 elemtype data;19 struct LinkedStackNode *next;20 }LinkedStackNode, *LinkedStack;21 LinkedStack top;2223 /* 顺序栈初始化 */24 SequenStack * Init_SequenStack()25 {26 SequenStack * S;27 S = (SequenStack *)malloc(sizeof(SequenStack));2829 if (S == NULL)30 {31 return S;32 }33 S->top = -1;34 return S;35 }3637 /*链栈的初始化*/38 LinkedStack Init_LinkedStack()39 {40 LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));4142 if(top != NULL)43 {44 top->next = NULL;45 }46 return top;47 }4849 /*判栈(顺序栈)空*/50 int SequenStack_Empty(SequenStack * S)51 {52 if (S->top == -1)53 {54 return 1;55 }56 else57 {58 return 0;59 }60 }6162 /* 判栈(链栈)空 */63 int LinkedStack_Empty(LinkedStack top)65 if (top->next == NULL)66 {67 return 1;68 }69 else70 {71 return 0;72 }7374 }7576 /* ⼊栈(顺序栈)*/77 int Push_SequenStack(SequenStack * S, elemtype x)78 {79 if (S->top >= MAXSIZE-1)80 {81 return 0;82 }83 S->top++;84 S->data[S->top] = x;85 return 1;86 }8788 /* 出栈(顺序栈) */89 int Pop_SequenStack(SequenStack * S, elemtype * x)90 {91 if (S->top == -1)92 {93 return 0;94 }95 else96 {97 S->top--;98 *x = S->data[S->top+1];99 return 1;100 }101 }102103 /* ⼊栈(链栈) */104 int Push_LinkedStack(LinkedStack top, elemtype x)105 {106 LinkedStackNode *node;107 node = (LinkedStackNode *)malloc(sizeof(LinkedStackNode)); 108109 if (node == NULL)110 {111 return 0;112 }113 else114 {115 node->data = x;116 node->next = top->next;117 top->next = node;118 return 1;119 }120121 }122123 /* 出栈(链栈) */124 int Pop_LinkedStack(LinkedStack top, elemtype * x)125 {126 LinkedStackNode *node;127 if (top->next == NULL)128 {129 return 0;130 }131 else132 {133 node = top->next;134 *x = node->data;135 top->next = node->next;136 free(node);137 return 1;138 }139140 }141142 /* 使⽤顺序⽅式进⾏进制转换的函数 */143 void SequenStackConversion(int N)144 {145 int x;146 SequenStack * S = Init_SequenStack();147 while (N > 0)149 Push_SequenStack(S, N % 16); 150 N = N / 16;151 }152 while (! SequenStack_Empty(S))153 {154 Pop_SequenStack(S, &x);155 switch (x)156 {157 case 10:158 printf("A");159 break;160 case 11:161 printf("B");162 break;163 case 12:164 printf("C");165 break;166 case 13:167 printf("D");168 break;169 case 14:170 printf("E");171 break;172 case 15:173 printf("F");174 break;175 default:176 printf("%d", x);177 break;178 }179 }180 }181182 /* 使⽤链栈⽅式进⾏进制转换的函数 */ 183 void ListStackConversion(int N)184 {185 int x;186 LinkedStack S = Init_LinkedStack(); 187 while (N > 0)188 {189 Push_LinkedStack(S, N % 16);190 N = N / 16;191 }192 while (! LinkedStack_Empty(S))193 {194 Pop_LinkedStack(S, &x);195 switch (x)196 {197 case 10:198 printf("A");199 break;200 case 11:201 printf("B");202 break;203 case 12:204 printf("C");205 break;206 case 13:207 printf("D");208 break;209 case 14:210 printf("E");211 break;212 case 15:213 printf("F");214 break;215 default:216 printf("%d", x);217 break;218 }219220 }221222 }223224 void function()225 {226 printf("-------------------------------------------\n"); 227 }228229 /* 主函数调⽤进制转换函数 */230 int main()231 {232 int N, x;233 printf("Please enter the decimal number you want want to convert:\n");234 scanf("%d", &N);235 function();236 printf("Choose using sequential stack or list stack\n");237 printf("1:Sequential stack 2:list stack:\n");238 function();239 scanf("%d", &x);240 printf("The converted binary number is:\n");241 switch (x)242 {243 case 1:244 SequenStackConversion(N);245 break;246 case 2:247 ListStackConversion(N);248 break;249 default:250 printf("error");251 break;252 }253254 return 0;255 }值得注意的是,当⼗进制转换为⼗六进制的时候,需要考虑输出现实⼤于9的⼗六进制位数,这⾥我们考虑可以使⽤switch开关实现。
栈的应用进制转换原理
栈的应用:进制转换原理什么是栈?栈(Stack)是一种数据结构,它采用“后进先出”的原则,即最后入栈的元素将第一个出栈。
栈可以分为静态栈和动态栈,静态栈的大小是固定的,而动态栈的大小可以动态调整。
栈的主要操作包括入栈(push)和出栈(pop)。
进制转换原理进制转换是计算机科学中的重要概念之一。
我们常用的数字系统是十进制(decimal system),即以10为基数的数字系统。
而计算机内部使用的是二进制(binary system),即以2为基数的数字系统。
在不同进制之间进行转换,需要了解进制转换的原理。
常见的进制有二进制、八进制和十六进制。
二进制是计算机中最基本的数字系统,由0和1两个数字组成。
八进制是以8为基数的数字系统,以0-7表示。
十六进制是以16为基数的数字系统,以0-9和A-F表示。
进制转换的基本方法进制转换的基本方法是不断地对给定的数值进行除法和取余操作,直到商为0为止。
将每一步的余数按照从下往上的顺序排列,就是转换后的结果。
下面以十进制到二进制的转换为例,详细介绍进制转换的基本方法。
十进制转换为二进制1.将给定的十进制数值不断除以2,记下每一步的余数。
直到商为0为止。
2.将每一步得到的余数按照从下往上的顺序排列,即为转换后的二进制数。
例如,将十进制数值23转换为二进制数值:23 ÷ 2 = 11 余 111 ÷ 2 = 5 余 15 ÷ 2 = 2 余 12 ÷ 2 = 1 余 01 ÷2 = 0 余 1将每一步的余数按照从下往上的顺序排列,得到二进制数值10111。
因此,十进制数值23转换为二进制数值为10111。
二进制转换为十进制1.将给定的二进制数值按照从右往左的顺序排列,从最右边的数字开始,每一位乘以2的相应次方。
2.将每个计算得到的结果相加,即为转换后的十进制数。
例如,将二进制数值10111转换为十进制数值:1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 16 + 0 + 4 + 2 + 1 = 23因此,二进制数值10111转换为十进制数值为23。
数据结构第三章 栈和队列part2)
多个函数嵌套调用的规则是:
后调用先返回 !
此时的内存管理实行“栈式管理”
例如:
void main( ){ void a( ){
…
…
a( );
b( );
…
…
}//main
}// a
void b( ){
… 函数b的数据区 函数a的数据区 Main的数据区
}// b
递归函数执行的过程可视为同一 函数进行嵌套调用.
例七、实现递归
当在一个函数的运行期间调用另一个函 数时,在运行该被调用函数之前, 需先完成三项任务:
• 将所有的实在参数、返回地址等信息传 递给被调用函数保存;
• 为被调用函数的局部变量分配存储区; • 将控制转移到被调用函数的入口。
从被调用函数返回调用函数之前,应该 完成下列三项任务:
• 保存被调函数的计算结果; • 释放被调函数的数据区; • 依照被调函数保存的返回地址将控
从原表达式求得后缀式的规律为:
1) 设立操作数栈; 2) 设表达式的结束符为“#”,
预设运算符栈的栈底为“#”;
3) 若当前字符是操作数, 则直接发送给后缀式。
从原表达式求得后缀式的规律为:
4) 若当前运算符的优先数高于栈顶运算 符,则进栈;
5) 否则,退出栈顶运算符发送给后缀式;
6) “(” 对它之前后的运算符起隔离作 用,“)”可视为自相应左括弧开始的 表达式的结束符。
// 从终端接收下一个字符
}
将从栈底到栈顶的字符传送至调用过程的数据区;
ClearStack(S);
// 重置S为空栈
if (ch != EOF) ch = getchar();
}
进制转换与栈
进制转换与栈进制转换与栈进制转换是计算机科学中的基础知识之一。
在日常生活中,我们常常使用十进制数系统,但在计算机内部表示和运算时,使用的是二进制数系统。
因此,需要进行不同进制之间的转换,以便在程序设计和数据存储方面更加方便和高效。
一、进制转换的分类进制转换可以分为两类:整数进制的转换和小数进制的转换。
1.1 整数进制的转换整数进制转换是将一个整数从一个进制表示转换到另一个进制表示,常见的有二进制、八进制、十进制和十六进制。
1.2 小数进制的转换小数进制转换是将一个小数从一个进制表示转换到另一个进制表示,常见的有二进制、八进制、十进制和十六进制。
其中,二进制小数转换需要使用补码表示,补码表示是一种为了解决负数的表示方式。
二、进制转换的实现方法进制转换可以使用很多种方法来实现,其中最常用的方法是除以目标进制进行逐位转换。
在实现中,可以使用栈来辅助实现进制转换。
2.1 栈的定义栈是一种特殊的数据结构,它的特点是先进后出,后进先出。
栈中最后一个进入的元素是第一个弹出的元素。
栈可以使用数组或链表实现,其中链表的实现会更具有灵活性和可扩展性。
2.2 进制转换的实现过程以十进制转二进制为例,进制转换的实现过程如下:- 将十进制数n除以2,得到商q和余数r,将余数r压入栈顶。
- 如果商q不为0,则将q作为新的n继续进行除2运算。
- 如果商q为0,则停止除法运算,将栈中存储的各位余数依次从栈中弹出,这就得到了十进制数n的二进制表示。
类似的,可以实现八进制、十六进制等数制之间的转换。
当需要实现小数进制的转换时,可以将小数部分分离并分别进行整数进制的转换,在使用补码表示后进行小数的转换。
三、进制转换的作用进制转换在计算机科学中是非常重要的基础知识。
在程序设计中,要经常进行不同进制之间的转换,例如,在数据传输时需要将二进制数据转换为其他进制数据类型;在显示数据时,常常需要将数据从十六进制转换为字符串。
在数据存储方面,很多数据都需要以二进制形式存储,因此需要进行进制转换。
Java数据结构——栈的应用(以数制转换为例子)
Java数据结构——栈的应⽤(以数制转换为例⼦)看⼀万遍,不如⾃⼰动⼿实践,请不要直接copy代码,先⾃⼰去理解例⼦实现的原理,然后试着⾃⼰动⼿去实践。
⽤Java去实现栈操作,会⽤到stack这个类,这类中有⼏个⽅法需要知道他们的⽤法
boolean empty()
测试堆栈是否为空。
Object peek( )
查看堆栈顶部的对象,但不从堆栈中移除它。
Object pop( )
移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object push(Object element)
把项压⼊堆栈顶部。
import java.util.Scanner;
import java.util.Stack;
public class Main
{
public static void main(String[] args)
{
final int type = 8;
int num = 0;
Scanner scanner = new Scanner(System.in);
num = scanner.nextInt();
Stack stack = new Stack();
while(num != 0)
{
stack.push(num%type);
num = num/8;
}
while(!stack.empty())
{
System.out.print(stack.peek());
stack.pop();
}
}
}。
栈的进制转换
一、实验目的掌握栈的基本用法二、实验准备计算机VC++6.0 Win7三、实验内容1、利用栈实现一个十进制数转换为二进制数和十六进制数。
程序:#include<stdio.h>#include <stdlib.h>#include <malloc.h>#define STACKSIZE 100#define ADD 10typedef 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;}bool Pop(sqstack & L,int &e){ //删除栈顶元素,并用e返回if(L.base==L.top)return false;e=*--L.top;return true;}bool Clearstake(sqstack &L){ //将栈置空L.base=L.top;return true;}int stackEmpty(sqstack L){ //判断栈是否为空if(L.base==L.top)return 1;else return -1;}bool DestroyStack(sqstack &L){ //销毁栈free(L.base);L.base=NULL;L.top=NULL;L.stacksize=0;return true;}bool Show(sqstack L ){ //将栈的元素全部输出来if(L.base==L.top)return false;printf("栈的元素是:");while(L.top>L.base){printf("%d\n",*(--L.top));}return true;}void change(sqstack &L,int m,int x){int i=0,e,n;n=m;if(x==2){while(n>0){Push(L,n%2);n/=2;i++;}printf("原数");printf("%d",m);printf("转化为二进制为:");for(;i>0;i--){Pop(L,e);printf("%d",e);}printf("\n");}if(x==16){while(n>0){Push(L,n%16);n/=16;i++;}printf("原数");printf("%d",m);printf("转化为十六进制为:");for(;i>0;i--){Pop(L,e);switch(e){case 10:printf("A");break;case 11:printf("B");break;case 12:printf("C");break;case 13:printf("D");break;case 14:printf("E");break;case 15:printf("F");break;default:printf("%d",e);break;}}printf("\n");}}int main(){sqstack L;Initstack(L);int m;printf("请输入要转换的数:");scanf("%d",&m);change(L,m,2);change(L,m,16);return 0;}截图:四、实验总结通过本次试验,我对栈的应用有了具体的了解。
数据结构实验报告-栈进制转换
数据结构实验报告-栈进制转换数据结构实验报告栈进制转换一、实验目的本实验旨在通过使用栈这种数据结构,实现不同进制之间的转换,加深对栈的基本概念、操作和应用的理解,提高编程能力和问题解决能力。
二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验原理进制转换是将一个数从一种进制表示形式转换为另一种进制表示形式的过程。
常见的进制有二进制、八进制、十进制和十六进制。
栈是一种特殊的线性表,它遵循“后进先出”(Last In First Out,LIFO)的原则。
在进制转换中,可以利用栈来存储转换过程中的余数,从而实现进制的转换。
以十进制转换为二进制为例,将十进制数除以 2 取余数,然后将商继续除以 2 取余数,直到商为 0。
将依次得到的余数从栈中取出,即可得到对应的二进制数。
四、实验内容与步骤(一)数据结构定义```cppclass Stack {private:int stackArray;int top;int capacity;public:Stack(int size) {capacity = size;stackArray = new intcapacity;top =-1;}~Stack(){delete stackArray;}void push(int element) {if (isFull()){std::cout <<"Stack Overflow" << std::endl; return;}stackArray++top = element;}int pop(){if (isEmpty()){std::cout <<"Stack Underflow" << std::endl; return -1;}return stackArraytop;}int peek(){if (isEmpty()){std::cout <<"Stack is empty" << std::endl; return -1;}return stackArraytop;}bool isEmpty(){return top ==-1;}bool isFull(){return top == capacity 1;}};```(二)十进制转二进制函数```cppvoid decimalToBinary(int decimalNumber) {Stack stack(32);while (decimalNumber > 0) {int remainder = decimalNumber % 2;stackpush(remainder);decimalNumber /= 2;}std::cout <<"十进制"<< decimalNumber <<"转换为二进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(三)十进制转八进制函数```cppvoid decimalToOctal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 8;stackpush(remainder);decimalNumber /= 8;}std::cout <<"十进制"<< decimalNumber <<"转换为八进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(四)十进制转十六进制函数```cppvoid decimalToHexadecimal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 16;if (remainder < 10) {stackpush(remainder +'0');} else {stackpush(remainder 10 +'A');}decimalNumber /= 16;}std::cout <<"十进制"<< decimalNumber <<"转换为十六进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(五)主函数```cppint main(){int decimalNumber;std::cout <<"请输入一个十进制数: ";std::cin >> decimalNumber; decimalToBinary(decimalNumber);decimalToOctal(decimalNumber);decimalToHexadecimal(decimalNumber);return 0;}```五、实验结果与分析(一)实验结果输入十进制数 25,得到以下结果:二进制:11001八进制:31十六进制:19(二)结果分析通过实验,成功实现了将十进制数转换为二进制、八进制和十六进制。
进制转换与栈
进制转换与栈一、引言进制转换是计算机科学中的重要概念,而栈是一种常用的数据结构。
本文将介绍进制转换的基本原理以及利用栈实现进制转换的方法。
二、进制转换的基本原理进制是表示数字的一种方式,常见的进制有十进制、二进制、八进制和十六进制。
不同进制之间可以相互转换,转换的原理是利用权重和除法运算。
1. 十进制转换为其他进制将十进制数除以进制数,得到的商再次除以进制数,直到商为0。
将每次的余数从下往上排列,即可得到转换后的结果。
2. 其他进制转换为十进制将其他进制的每一位数乘以对应的权重,然后将结果相加,即可得到转换后的十进制数。
三、栈的概念与特点栈是一种特殊的线性数据结构,它具有后进先出(LIFO)的特点。
栈有两个基本操作:入栈(push)和出栈(pop)。
1. 入栈:将数据元素放到栈的顶部。
2. 出栈:从栈的顶部移除数据元素。
栈的应用十分广泛,包括括号匹配、函数调用的存储、表达式求值等。
四、利用栈实现进制转换栈可以很好地辅助进制转换的过程。
以将十进制数转换为二进制数为例,具体步骤如下:1. 将十进制数除以2,得到的余数入栈。
2. 再将商除以2,得到的余数入栈,以此类推,直到商为0。
3. 将栈中的元素依次出栈,即可得到转换后的二进制数。
以将十进制数28转换为二进制数为例,具体步骤如下:1. 第一次除以2,商为14,余数为0,入栈。
2. 第二次除以2,商为7,余数为1,入栈。
3. 第三次除以2,商为3,余数为1,入栈。
4. 第四次除以2,商为1,余数为1,入栈。
5. 第五次除以2,商为0,余数为1,入栈。
依次出栈得到的结果为11100,即28的二进制表示为11100。
五、其他进制的转换利用栈,我们还可以实现其他进制的转换,只需要将除法运算中的2替换成对应的进制数即可。
六、总结本文介绍了进制转换的基本原理以及利用栈实现进制转换的方法。
进制转换是计算机科学中常见的操作,掌握了进制转换的原理和方法,可以更好地理解计算机内部的数据表示方式。
栈的应用进制转换实验原理
栈的应用:进制转换实验原理1. 引言进制转换是计算机科学中重要的基础知识之一。
在日常生活中,我们经常会遇到需要将一个数值从一种进制转换为另一种进制的情况,比如将十进制数转换为二进制数或十六进制数。
在计算机系统中,进制转换也是非常常见的操作,特别是在数据存储和传输方面。
本文将介绍一种利用栈数据结构进行进制转换的实验原理。
栈是一种后进先出(LIFO)的数据结构,非常适合处理进制转换这类需要按照逆序处理的问题。
2. 实验原理进制转换的基本原理是不断地将一个数值除以目标进制的基数,并将余数保存在栈中,直到商为0为止。
然后从栈中依次取出余数构成转换后的数值。
以下是进制转换实验的基本原理步骤:2.1 准备工作首先,我们需要准备一个空栈,用于临时保存余数。
2.2 输入初始数值和目标进制我们需要输入一个初始数值和目标进制。
初始数值可以是十进制、二进制、八进制或十六进制,目标进制可以是二进制、八进制、十进制或十六进制。
2.3 进制转换的具体步骤1.用初始数值除以目标进制的基数,得到商和余数。
2.将余数保存在栈中。
3.将商作为新的初始数值,重复步骤1直到商为0。
4.从栈中依次取出余数,将它们构成转换后的数值。
2.4 输出转换结果根据目标进制的不同,我们需要对转换结果进行相应的转换和输出。
例如,如果目标进制为二进制,我们需要将十进制转换结果转换为二进制表示法。
3. 实验示例下面以将十进制数转换为二进制数的实验为例,演示栈在进制转换中的应用。
3.1 准备工作首先,我们准备一个空栈。
3.2 输入初始数值和目标进制假设我们要将十进制数42转换为二进制数。
3.3 进制转换的具体步骤1.将42除以2,得到商21和余数0。
2.将余数0保存在栈中。
3.将商21作为新的初始数值。
4.将21除以2,得到商10和余数1。
5.将余数1保存在栈中。
6.将商10作为新的初始数值。
7.重复步骤4至步骤6。
8.最终商为0,退出循环。
3.4 输出转换结果将栈中的余数依次取出,即可得到二进制数101010。
数制转换(栈应用)实验报告
数制转换(栈应用)实验报告实验报告1.实验题目运用栈进行数制转换。
2.需求分析用C编写完成:对于输入的任意一个非负十进制整数,输出与其等值的其他进制数。
3.概要设计由于运行过程是从低位到高位顺序产生进制数的各个数位,而输出应从高位到底位进行,这和计算过程相反,恰好可以运用栈把进制数的各位顺序入栈,而按出栈序列输出,即为对应转换的进制数。
4.详细设计1)先对栈定义:Typedef struct{SElemType *base;SElemType *top;int stacksize;}Stack;2)构造一个栈:int InitStack(Stack &S)//初始化栈{S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if(!S.base) exit (ERROR); //存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}3)分别进行入栈和出栈操作,再进行进制转换。
5.调试分析#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0//栈定义typedef struct{int *base;int *top;int stacksize;}Stack;int InitStack(Stack &S)//初始化栈{S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));if(!S.base) exit (ERROR); //存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}int push(Stack &S,int e)//入栈{if(S.top-S.base>=S.stacksize) //栈满{S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(int));if(!S.base) exit (ERROR); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 1;}int pop(Stack &S,int &e)//出栈{if(S.top==S.base) return ERROR;//栈空e=* --S.top;return OK;}void conversion(int n,int m)//n为十进制数,m为要转换进制{Stack S;InitStack(S);while(n!=0){push(S,n%m);n=n/m;}while(S.top!=S.base){int x;pop(S,x);printf("%x",x);}}int main(){int n,m;printf("请输入一个十进制正整数:");scanf("%d",&n);printf("\n输入要转换进制:");scanf("%d",&m);if(m<2){printf("输入不合法!请输入大于1的进制!"); printf("\n");return ERROR;}conversion(n,m);printf("\n");return OK;}。
数制转换(栈的应用)
实验二栈的应用(数制转换)一、实验目的掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。
二、实验要求1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存程序的运行结果,并结合程序进行分析。
三、实验内容利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。
算法为:1、定义栈的顺序存取结构2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)3、定义一个函数用来实现上面问题:(1)十进制整数X和R作为形参(2)初始化栈(3)只要X不为0重复做下列动作将X % R入栈, X=X/R(4)只要栈不为空重复做下列动作栈顶出栈 , 输出栈顶元素四、实验报告要求:1、十进制整数转化为R进制整数算法的代码;2、程序运行结果及分析;3、实验总结。
具体实现:/*栈(综合)时间------2012 3 16*/# include <stdio.h># include <malloc.h># include <stdlib.h>typedef struct node{int data;struct node *next;}NODE , *PNODE;typedef struct stack{PNODE top; //!!!!节点指针类型,用于保存当前栈顶节点的地址(top 和 bottom 均为栈所需成员)PNODE bottom; //!!!节点指针类型,用于保存栈内最后一个节点的下一个无实际含义节点的地址,操作中,此指针无需变更}STACK , *PSTACK;void push_stack(PSTACK ps,int val);void init_stack(PSTACK ps);void travel_stack(PSTACK ps);bool is_empty(PSTACK ps);void pop_stack(PSTACK ps,int * val);void swap_stack(PSTACK ps,int val,int R);int main(void){STACK s;int X;int R;init_stack(&s); //对 s 的两个参数进行初始化(top 和 bottom)printf("请输入你想转换的数X和想转换成的进制R:");scanf("%d%d",&X,&R);swap_stack(&s,X,R);travel_stack(&s);return 0;}void init_stack(PSTACK ps){ps->top = (PNODE)malloc(sizeof(NODE)); //动态分配了一个NODE类型节点,并把首地址赋给ps->top(即由ps->top指向)if (NULL == ps->top){printf("动态内存分配失败!\n");exit(-1);}else{ps->top->next = NULL; //ps->bottom = ps->top; //刚开始栈顶指针和尾指针指向同一个节点(即栈里最后一个节点的下一个无实际含义的节点),并将该节点指针域清空}return;}void push_stack(PSTACK ps,int val){PNODE p = (PNODE)malloc(sizeof(NODE)); //创建新结点,并把结点首地址赋给Pp->data = val; //把输入值赋给新结点的数据域p->next = ps->top; //上一次栈顶地址由p->top 保存的,现在赋给新栈顶 p->next(p->top保存的是结点整体的地址,而p的指针域p->next也是保存结点整体的地址)ps->top = p; //再把栈顶指针指向新栈顶结点(新节点地址赋给栈顶指针)return;}void travel_stack(PSTACK ps) //遍历输出函数{PNODE p = ps->top; //工作指针先指向栈顶while(p != ps->bottom) //当工作指针 = 尾指针时,遍历结束{printf("%d",p->data);p = p->next; //工作指针逐步下移}printf("\n");return;}void pop_stack(PSTACK ps,int * pval){if(is_empty(ps)){return ;}else{PNODE q = ps->top; //再定义一个节点指针类型,用于保存待出栈节点地址,一边下面的free(q)(释放内存)(q和ps->top类型一样,都是保存结点整体地址的)*pval = q->data; //保存出栈数据,形参*val就是实参 valps->top = q->next; //上一步把栈顶地址赋给了q,(旧栈顶即将出栈,q的下一个节点将成为栈顶)所以........free(q); //释放出栈结点内存return ;}}bool is_empty(PSTACK ps){if(ps->top == ps->bottom)return true;elsereturn false;}void swap_stack(PSTACK ps,int X,int R){PNODE p = ps->top;while(X != 0){push_stack(ps,X%R);X = X/R;}return;}。
数据结构:进制转换(栈的思想)
void main() { int m,n,e; printf("请输入要转换的十进制数字 m: "); scanf("%d",&m); printf("请输入要转换的进制数字 n: "); scanf("%d",&n); printf(" 结 果 为:"); while(m) { push(m%n); m=m/n; } while(empty()) { pop(&e); printf("%d",e); } printf("\n"); }
1.上机-S 流程图:
3.程序代码: // 进制转换 //#include "stdafx.h" #include "stdio.h" #define max 50 int stack[max]; int top=0; //初始栈 /*-------进栈操作------*/ void push(int x) { stack[top++]=x; //X 进栈 } /*-------出栈操作------*/ void pop(int *e) { if(top==0) printf("overflow"); *e=stack[--top]; } /*-----判断是否空栈----*/ int empty() { if(top==0) return 0; else return 1; }
4. 截 图:
分析: 刚开始的代码为: /*-------出栈操作------*/ void pop(int e) {
if(top==0) printf("overflow"); else return(e=stack[--top]); } 其中,没有将 e 设置成指针变量,结果返回函数值的时候出错,这是因为子函数 中的 e 并不是全局变量,e 只在子函数中生效,因此传过去的是错误的结果。当 改成指针变量的时候函数之间的参数可以很好的传递了。因此,在调用子函数时 候,最好设置指针变量。
数据结构与算法--栈的应用(进制转换、括号匹配)
数据结构与算法--栈的应⽤(进制转换、括号匹配)栈的应⽤ps:⽤栈很简单实现的应⽤有很多,⽐如说进制转换,括号匹配等。
学计算机的都知道,2进制,8进制,10进制,16进制等,进制之间的转换也是需要掌握的,以备不时之需,所以我们可以⾃⼰写⼀段程序如果会android的话,可以直接打包成APK。
下⾯就按照这两个应⽤稍微写⼀点C语⾔的代码。
进制转换括号匹配1:进制转换 想要⾃⼰做⼀个进制转换的⼯具,⾸先我们要知道如何实现进制之间的转换,我们平常⽤的都是10进制,如果想要转成8进制怎么办,按照⽅法,如图可以看到,N是我们输⼊的10进制数,除以8,余数保留在栈中,得到的168接着与8整除运算,直到N div 8 等于0,最后把栈中数据取出即可,正好⽤到了栈的规则,先进后出的特性。
1.1:定义栈结构体typedef struct zhan{int data;struct zhan *next;}zhan,*ZhanL;1.2:初始化栈/*** 初始化栈* */ZhanL initZhan(){ZhanL L =(ZhanL)malloc(sizeof(zhan));L->next=NULL;return L;}1.3进栈出栈操作在pop⽅法中,把L赋给s,主要是出栈后,把空余的栈位释放掉,push⽅法⽤到了尾插法。
/*** 进栈操作* */int push(ZhanL &L,int data){//创建⼀个新的结点ZhanL p=(ZhanL)malloc(sizeof(zhan));p->data=data;p->next = L;L = p;return0;}int pop(ZhanL &L){if(L->next){ZhanL s=L;//释放空间⽤printf("%d ",s->data);L = L->next;if(L->next){// printf("栈顶%d \n",L->data);} else{printf("栈空\n");}free(s);}return0;}1.4:转换⽅法/*** 转换⽅法* */int zhuanhuan(ZhanL &L,int data,int jz){while (data){push(L,data%jz);data = data/jz;}while (L){pop(L);}return0;}1.5:使⽤int main(){ZhanL L;L=initZhan();printf("请输⼊⼀个⼗进制数");int data,jz;scanf("%d",&data);printf("请输⼊转换的进制");scanf("%d",&jz);zhuanhuan(L,data,jz);return0;}结果图:2:括号匹配什么是括号匹配?在编写代码的时候,经常会⽤到两种括号:圆括号 “()” 和⼤括号 “{}” 。
栈的应用举例
数据结构
栈的应用举例
1、数制转换(十转N)
设计思路:用栈暂存低位值
2、括号匹配问题
设计思路:用栈暂存左括号
3、子程序的调用
设计思路:用栈暂存指令地址
4、逆置一个单链表
设计思路:用栈暂存每一结点
例3.2 将十进制整数转换成二至九之间的任一进 制数输出
将一个十进制数4327转换成八进制数(10347)8:
void conversion(int N, int r)
解题思路如下:
{ int x=N,y=r; SeqStack *s;
s=InitStack(); while(Ns中;
{ Push(s, N %r ); N=N/r ;
2、用N/r代替N;
数据结构
解题思路如下:
1、建立一个带头结点的单链表 head; 2、输出该单链表; ; 3、建立一个空栈s(顺序栈); 4、依次将单链表的数据入栈; 5、依次将单链表的数据出栈, 并逐个将出栈的数据存入单链 表的数据域(自前向后);
6、再输出单链表。
linklist*backlinklist(linklist *head) {linklist *p;
3、若N>0,则重复 (1)、(2);若N=0, 则将栈s的内容依次出 栈。
}
printf(“\n 十 进 制 数 %d 所 对 应 的 %d 进 制 数是:”,x,y);
进制转换与栈
进制转换与栈进制转换是计算机科学中非常基础而重要的概念,它涉及到不同进制之间的数值表示转换。
而在实现进制转换的过程中,栈结构也扮演着至关重要的角色。
本文将探讨进制转换的基本原理,介绍如何利用栈来实现进制转换,并举例说明其在实际应用中的重要性。
进制是用来表示数值的一种方法,常见的进制包括二进制、八进制、十进制和十六进制。
在进行进制转换时,我们需要将一个数值从一种进制表示转换为另一种进制表示。
例如,将一个二进制数转换为十进制数,或者将一个十进制数转换为十六进制数。
在进行进制转换时,我们可以利用栈这种数据结构来辅助完成。
栈是一种后进先出(LIFO)的数据结构,我们可以利用栈的特性来反转数值的顺序。
以十进制转换为二进制为例,我们可以将十进制数每次除以2,将余数压入栈中,最后依次弹出栈中的元素,即可得到对应的二进制表示。
除了十进制转换为二进制,栈还可以用来实现其他进制之间的转换。
例如,将十进制数转换为八进制或十六进制,或者将十六进制数转换为二进制或十进制。
无论是哪种进制之间的转换,栈都能够提供一个方便而高效的方法。
在实际应用中,进制转换与栈密不可分。
计算机在进行进制转换时,通常会利用栈这种数据结构来辅助完成。
例如,在编写程序时,我们可能会遇到需要将不同进制的数值进行转换的情况,这时栈可以帮助我们高效地完成这一转换过程。
进制转换与栈是计算机科学中非常重要的概念,它们在实际应用中发挥着重要作用。
通过掌握进制转换的基本原理和利用栈来实现转换的方法,我们可以更好地理解计算机中数值表示的转换过程,提高编程能力,并更好地应用于实际项目中。
希望本文对读者有所帮助,谢谢阅读!。
利用栈实现输入整数n的八进制转换。
利用栈实现输入整数n的八进制转换。
栈是一种常见的数据结构,它满足先进后出的特性。
利用栈可以将十进制数转换为八进制数,具体实现如下:步骤一:定义一个空栈,用于存储转换后的八进制数的每一位。
Step 1: Create an empty stack to store each digit of the converted octal number.步骤二:利用求余运算符,将输入的十进制数不断除以8,将每次的余数入栈,直到商为0为止。
Step 2: Continuously divide the input decimal number by 8 using the modulo operator and push the remainder onto the stack until the quotient becomes 0.步骤三:从栈中依次弹出每一位,得到转换后的八进制数。
Step 3: Pop each digit from the stack and concatenate them to obtain the converted octal number.下面是一个实现该算法的示例代码:pythondef decimal_to_octal(n):# 创建一个空栈stack = []# 将十进制数不断除以8,将每次的余数入栈,直到商为0为止while n > 0:remainder = n % 8stack.append(str(remainder))n = n 8# 从栈中依次弹出每一位,得到转换后的八进制数octal_number = ''while stack:octal_number += stack.pop()return int(octal_number)# 测试n = int(input("请输入一个整数:"))octal = decimal_to_octal(n)print("转换后的八进制数为:", octal)以上代码首先定义了一个`decimal_to_octal` 函数,该函数接收一个十进制数`n` 作为输入,并将其转换为八进制数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈的应用(数制转换)
一、实验目的
掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。
二、实验要求
1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存程序的运行结果,并结合程序进行分析。
三、实验内容
利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。
算法为:
1、定义栈的顺序存取结构
2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)
3、定义一个函数用来实现上面问题:
(1)十进制整数X和R作为形参
(2)初始化栈
(3)只要X不为0重复做下列动作
将X % R入栈, X=X/R
(4)只要栈不为空重复做下列动作
栈顶出栈 , 输出栈顶元素
四、实验报告要求:
1、十进制整数转化为R进制整数算法的代码;
2、程序运行结果及分析;
3、实验总结。
具体实现:
/*
栈(综合)时间------2012 3 16
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE , *PNODE;
typedef struct stack
{
PNODE top; //!!!!节点指针类型,用于保存当前栈顶节点的地址(top 和 bottom 均为栈所需成员)
PNODE bottom; //!!!节点指针类型,用于保存栈内最后一个节点的下一个无实际含义节点的地址,操作中,此指针无需变更
}STACK , *PSTACK;
void push_stack(PSTACK ps,int val);
void init_stack(PSTACK ps);
void travel_stack(PSTACK ps);
bool is_empty(PSTACK ps);
void pop_stack(PSTACK ps,int * val);
void swap_stack(PSTACK ps,int val,int R);
int main(void)
{
STACK s;
int X;
int R;
init_stack(&s); //对 s 的两个参数进行初始化(top 和 bottom)printf("请输入你想转换的数X和想转换成的进制R:");
scanf("%d%d",&X,&R);
swap_stack(&s,X,R);
travel_stack(&s);
return 0;
}
void init_stack(PSTACK ps)
{
ps->top = (PNODE)malloc(sizeof(NODE)); //动态分配了一个NODE类型节点,并把首地址赋给ps->top(即由ps->top指向)
if (NULL == ps->top)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
ps->top->next = NULL; //
ps->bottom = ps->top; //刚开始栈顶指针和尾指针指向同一个节点(即栈里最后一个节点的下一个无实际含义的节点),并将该
节点指针域清空
}
return;
}
void push_stack(PSTACK ps,int val)
{
PNODE p = (PNODE)malloc(sizeof(NODE)); //创建新结点,并把结点首地址赋给P
p->data = val; //把输入值赋给新结点的数据域
p->next = ps->top; //上一次栈顶地址由p->top 保存的,现在赋给新栈顶 p->next(p->top保存的是结点整体的地址,而p的指针域p->next也是保存结点整体的地址)
ps->top = p; //再把栈顶指针指向新栈顶结点(新节点地址赋给栈顶指针)
return;
}
void travel_stack(PSTACK ps) //遍历输出函数
{
PNODE p = ps->top; //工作指针先指向栈顶
while(p != ps->bottom) //当工作指针 = 尾指针时,遍历结束
{
printf("%d",p->data);
p = p->next; //工作指针逐步下移}
printf("\n");
return;
}
void pop_stack(PSTACK ps,int * pval)
{
if(is_empty(ps))
{
return ;
}
else
{
PNODE q = ps->top; //再定义一个节点指针类型,用于保存待出栈节点地址,一边下面的free(q)(释放内存)(q和ps->top类型一样,都是保存结点整体地址的)
*pval = q->data; //保存出栈数据,形参*val
就是实参 val
ps->top = q->next; //上一步把栈顶地址赋给了q,(旧栈顶即将出栈,q的下一个节点将成为栈顶)所以........
free(q); //释放出栈结点内存
return ;
}
}
bool is_empty(PSTACK ps)
{
if(ps->top == ps->bottom)
return true;
else
return false;
}
void swap_stack(PSTACK ps,int X,int R)
{
PNODE p = ps->top;
while(X != 0)
{
push_stack(ps,X%R);
X = X/R;
}
return;
}。