数制转换(栈的应用)
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;}截图:四、实验总结通过本次试验,我对栈的应用有了具体的了解。
- 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;
}。