Java利用栈实现二进制和十进制、八进制、十六进制的互相转换

比眉伴天荒 2023-07-09 13:24 83阅读 0赞

点击进入尚硅谷数据结构和算法Java代码导航

  1. package stack;
  2. import java.util.Stack;
  3. public class Sequence {
  4. int MAX;
  5. int len;
  6. int[] data;
  7. int top;
  8. public Sequence(int m) {
  9. this.MAX = m;
  10. this.data = new int[m];
  11. this.top = -1;
  12. this.len = 0;
  13. }
  14. //压栈
  15. public boolean push(int temp) {
  16. if(this.len == this.MAX) {
  17. System.out.println("Push failed.");
  18. return false;
  19. }
  20. top++;
  21. len++;
  22. data[top] = temp;
  23. return true;
  24. }
  25. //出栈
  26. public int pop() {
  27. int temp = data[top];
  28. top--;
  29. len--;
  30. return temp;
  31. }
  32. //获取top数据
  33. public int getTop() {
  34. return data[top];
  35. }
  36. //二进制转十进制
  37. public int binTo10() {
  38. int sum = 0;
  39. for(int i=0; len!=0; i++) {
  40. sum += Math.pow(2, i) * pop();
  41. }
  42. System.out.println(sum);
  43. return sum;
  44. }
  45. //十进制转二进制
  46. public Sequence tenTo2(int k) {
  47. Sequence s = new Sequence(this.MAX*4);
  48. while(k != 0) {
  49. s.push(k % 2);
  50. k /= 2;
  51. }
  52. for(int i=0; s.len!=0; i++) {
  53. System.out.print(s.pop());
  54. }
  55. return s;
  56. }
  57. //二进制转八进制
  58. public Sequence binTo8() {
  59. Sequence s = new Sequence(this.MAX);
  60. int sum = 0;
  61. while(this.len!=0) {
  62. sum = 0;
  63. if(this.len >= 3) {
  64. //大于三位取三位,小于三位取剩下所有的
  65. for(int j=0; j<3; j++) {
  66. sum += Math.pow(2, j) * pop();
  67. }
  68. }else {
  69. for(int j=0; this.len!=0; j++) {
  70. sum += Math.pow(2, j) * pop();
  71. }
  72. }
  73. s.push(sum);
  74. }
  75. for(int i=0; s.len!=0; i++) {
  76. System.out.print(s.pop());
  77. }
  78. return s;
  79. }
  80. //八进制转二进制
  81. public Sequence eightTo2() {
  82. Sequence s = new Sequence((this.MAX)*3);
  83. int temp;
  84. while(this.len!=0) {
  85. //这个循环是为了取出所有数
  86. temp = this.pop();
  87. for(int i=0; i<3; i++) {
  88. //八进制的每位数转为二进制的三位,所以要三次压栈
  89. if(temp != 0) {
  90. s.push(temp % 2);
  91. temp /= 2;
  92. }else {
  93. //数不足用0补全
  94. s.push(0);
  95. }
  96. }
  97. }
  98. while(s.getTop() == 0) {
  99. s.pop();
  100. }
  101. for(int i=0; s.len!=0; i++) {
  102. System.out.print(s.pop());
  103. }
  104. return s;
  105. }
  106. //二进制转十六进制
  107. public Sequence binTo16() {
  108. Sequence s = new Sequence(MAX);
  109. int sum;
  110. while(this.len != 0) {
  111. sum = 0;
  112. if(this.len>=4) {
  113. for(int i=0; i<4; i++) {
  114. sum += Math.pow(2, i) * pop();
  115. }
  116. }else {
  117. for(int i=0; this.len!=0; i++) {
  118. sum += Math.pow(2, i) * pop();
  119. }
  120. }
  121. s.push(sum);
  122. }
  123. for(int i=0; s.len!=0; i++) {
  124. System.out.print(tenTo16(s.pop()));
  125. }
  126. return s;
  127. }
  128. //十进制转为十六进制,简单的方法:Integer.toHexString()
  129. public char tenTo16(int k) {
  130. if(k<10) {
  131. return (char)k;
  132. }else {
  133. switch(k) {
  134. case 10: return 'A';
  135. case 11: return 'B';
  136. case 12: return 'C';
  137. case 13: return 'D';
  138. case 14: return 'E';
  139. case 15: return 'F';
  140. default: return 'G';
  141. }
  142. }
  143. }
  144. //十六进制转二进制
  145. public Sequence SixteenTo2(String str) {
  146. Sequence s = new Sequence(str.length()*4);
  147. int temp;
  148. for(int i=str.length(); i>0; i--) {
  149. temp = SixteenTo10(str.substring(i-1, i));
  150. for(int j=0; j<4; j++) {
  151. if(temp != 0) {
  152. s.push(temp % 2);
  153. temp /= 2;
  154. }else {
  155. s.push(0);
  156. }
  157. }
  158. }
  159. while(s.getTop() == 0) {
  160. s.pop();
  161. }
  162. for(int i=0; s.len!=0; i++) {
  163. System.out.print(s.pop());
  164. }
  165. return s;
  166. }
  167. //十六进制转十进制,简单方法:Integer.parseInt(String s, int radix)
  168. public int SixteenTo10(String str) {
  169. int k = 0;
  170. switch(str) {
  171. case "0": k = 0; break;
  172. case "1": k = 1; break;
  173. case "2": k = 2; break;
  174. case "3": k = 3; break;
  175. case "4": k = 4; break;
  176. case "5": k = 5; break;
  177. case "6": k = 6; break;
  178. case "7": k = 7; break;
  179. case "8": k = 8; break;
  180. case "9": k = 9; break;
  181. case "A": k = 10; break;
  182. case "B": k = 11; break;
  183. case "C": k = 12; break;
  184. case "D": k = 13; break;
  185. case "E": k = 14; break;
  186. case "F": k = 15; break;
  187. }
  188. return k;
  189. }
  190. public static void main(String[] args) {
  191. // TODO Auto-generated method stub
  192. Sequence se = new Sequence(20);
  193. // se.push(1);
  194. // se.push(0);
  195. // se.push(1);
  196. // se.push(0);
  197. // se.push(1);
  198. // se.push(0);
  199. // se.push(1);
  200. // se.push(1);
  201. // se.bin28();
  202. // se.binTo10();
  203. // se.binTo16();
  204. // se.push(2);
  205. // se.push(5);
  206. // se.push(3);
  207. // se.eightTo2();
  208. se.SixteenTo2("ABC");
  209. }
  210. }

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读