使用Java在没有选项卡的情况下划出控制台文本
嘿,我目前正在用Java编写一个表达式计算器。我现在已经让它工作了,但我不知道如何在终端中留出书写空间。我想要的是两个相邻的列表。我本来想用一个标签,但因为数组可以增长,它会移动另一个。我现在得到的是:使用Java在没有选项卡的情况下划出控制台文本,java,string,printing,stack,shunting-yard,Java,String,Printing,Stack,Shunting Yard,嘿,我目前正在用Java编写一个表达式计算器。我现在已经让它工作了,但我不知道如何在终端中留出书写空间。我想要的是两个相邻的列表。我本来想用一个标签,但因为数组可以增长,它会移动另一个。我现在得到的是: OUTPUT BUFFER STACK [] [] [(] [] [(] [4] [(, +]
OUTPUT BUFFER STACK
[] []
[(] []
[(] [4]
[(, +] [4]
[(, +, (] [4]
[(, +, (] [4, 2]
[(, +, (, *] [4, 2]
[(, +, (, *, (] [4, 2]
[(, +, (, *, (] [4, 2, -2]
[(, +, (, *, (, -] [4, 2, -2]
[(, +, (, *, (, -] [4, 2, -2, 1]
[(, +, (, *] [4, 2, -2, 1, -]
[(, +] [4, 2, -2, 1, -, *]
[] [4, 2, -2, 1, -, *, +]
[*] [4, 2, -2, 1, -, *, +]
[*] [4, 2, -2, 1, -, *, +, 1.5]
[%] [4, 2, -2, 1, -, *, +, 1.5, *]
FINAL OUTPUT: [4, 2, -2, 1, -, *, +, 1.5, *, 2, %]
INFIX: ( 4 + ( 2 * ( -2 - 1 ) ) ) * 1.5 % 2
POSTFIX: 4 2 -2 1 - * + 1.5 * 2 %
TOKEN ACTION STACK
4 Add [4.0]
2 Add [4.0, 2.0]
-2 Add [4.0, 2.0, -2.0]
1 Add [4.0, 2.0, -2.0, 1.0]
- Operate [4.0, 2.0, -3.0]
* Operate [4.0, -6.0]
+ Operate [-2.0]
1.5 Add [-2.0, 1.5]
* Operate [-3.0]
2 Add [-3.0, 2.0]
% Operate [-1.0]
ANSWER: -1.0
以下是我想要实现的目标:
OUTPUT BUFFER STACK
[] []
[(] []
[(] [4]
[(, +] [4]
[(, +, (] [4]
[(, +, (] [4, 2]
[(, +, (, *] [4, 2]
[(, +, (, *, (] [4, 2]
[(, +, (, *, (] [4, 2, -2]
[(, +, (, *, (, -] [4, 2, -2]
[(, +, (, *, (, -] [4, 2, -2, 1]
[(, +, (, *] [4, 2, -2, 1, -]
[(, +] [4, 2, -2, 1, -, *]
[] [4, 2, -2, 1, -, *, +]
[*] [4, 2, -2, 1, -, *, +]
[*] [4, 2, -2, 1, -, *, +, 1.5]
[%] [4, 2, -2, 1, -, *, +, 1.5, *]
FINAL OUTPUT: [4, 2, -2, 1, -, *, +, 1.5, *, 2, %]
INFIX: ( 4 + ( 2 * ( -2 - 1 ) ) ) * 1.5 % 2
POSTFIX: 4 2 -2 1 - * + 1.5 * 2 %
TOKEN ACTION STACK
4 Add [4.0]
2 Add [4.0, 2.0]
-2 Add [4.0, 2.0, -2.0]
1 Add [4.0, 2.0, -2.0, 1.0]
- Operate [4.0, 2.0, -3.0]
* Operate [4.0, -6.0]
+ Operate [-2.0]
1.5 Add [-2.0, 1.5]
* Operate [-3.0]
2 Add [-3.0, 2.0]
% Operate [-1.0]
ANSWER: -1.0
以下是我当前用于打印堆栈和输出缓冲区的代码:
System.out.println("OUTPUT BUFFER\t\t\t\tSTACK");
ArrayList<String> out = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
for(String token : inputTokens){
System.out.print(stack+ "\t\t\t\t\t");
System.out.println(out);
if(isOperator(token)){
while(!stack.empty() && isOperator(stack.peek())){
if (checkPri(token, stack.peek())<=0 || checkPri(token, stack.peek()) < 0 ){
out.add(stack.pop());
//System.out.println("OUTPUT: " + out);
continue;
}
break;
}
stack.push(token);
}else if(token.equals("(")){
stack.push(token);
}else if(token.equals(")")){
while(!stack.empty() && !stack.peek().equals("(")){
out.add(stack.pop());
}
stack.pop();
} else {
out.add(token);
//System.out.println("OUTPUT BUFFER: " + out);
}
}
System.out.println(“输出缓冲区\t\t\t\tSTACK”);
ArrayList out=新的ArrayList();
堆栈=新堆栈();
for(字符串标记:InputOkens){
System.out.print(堆栈+“\t\t\t\t\t”);
System.out.println(out);
if(等运算符(令牌)){
而(!stack.empty()&&isOperator(stack.peek()){
如果(checkPri(token,stack.peek())您可以使用String.format(String,args…)或System.out.printf(String,args…)
我不知道如何解释,因为我的英语很差,但这里有一个例子:
int i=10000,j=200,k=5000000;
System.out.printf("%10d%10d%10d",i,j,k);
将获得以下输出:
10000 200 5000000
^ ^ ^each has ten spaces between them because of %10d
当打印出任何一行“输出缓冲区”时,你需要知道两件事:1.这个字符串有多长?2.最长的输出缓冲区字符串有多长?1.很简单(你知道元素的数量)但对于2.您需要在不输出和保存最长行的长度的情况下完成整个过程,并且只有在完成后才能很好地打印出所有内容。打印数组时也可以这样做吗?。但要使其工作,您需要提前知道最长的字符串。(当然:您可以硬编码一个数字“这肯定足够长”)arr..无法直接打印数组,但是可以使用java.util.Arrays.toString(Object[])来打印数组。没错,您必须知道这些字符串中最长的长度。