package zhan;
public class CircularArrayQueue<T> implements Queue<T> {
private final int DEFAULT_CAPACITY = 10;
private int front, rear, cout;
private T[] queue;
public CircularArrayQueue() {
front = rear = cout = 0;
queue = (T[]) (new Object[DEFAULT_CAPACITY]);
}
@Override
public void enqueue(T element) {
if (cout == queue.length)
expandCapacity();
queue[rear] = element;
rear = (rear+1)%queue.length;
cout++;
}
private void expandCapacity() {
T[] larger = (T[]) (new Object[queue.length * 2]);
for (int index = 0; index < cout; index++)
larger[index] = queue[(front + index) % queue.length];
front = 0;
rear = cout;
queue = larger;
}
@Override
public T dequeue() throws EmptyCollectionException{
T s;
if(front == rear&&queue[front]==null)
throw new EmptyCollectionException("队列已空");
else {
s = queue[front];
queue[front]=null;
front=(front+1)%queue.length;
cout--;
}
return s;
}
@Override
public T first() throws EmptyCollectionException {
if(front == rear&&queue[front]==null)
{
throw new EmptyCollectionException("数组已空");
}
else
return queue[front];
}
@Override
public boolean isEmpty() {
if(cout == 0)
return false;
else
return true;
}
@Override
public int size() {
return cout;
}
public String toString()
{
String result="";
for(int i = 0 ;i<queue.length;i++)
{
result += " " + queue[i];
}
return result;
}
}
从左到右扫描后缀表达式:
1.如果是操作数,则直接将其指针压入栈中
2.如果是操作符,则依次弹出两个栈顶指针进行字符串拼接后,再和操作符进行拼接,返回新的指针压入栈中(先弹出的拼接在后弹出的后面,操作符拼接在最前面)
3.直到扫描结束,将栈顶指针弹出,即为前缀表达式字符串的指针
于是,我们可以得到以下结果
《代码问题解决方案1》
下面为我们的核心代码
import java.util.Scanner;
import java.util.Stack;
public class change {
private Stack<String> stack;
private final char add = '+';
private final char subtract='-';
private final char multiply='*';
private final char divide='/';
public change()
{
stack = new Stack<String>();
}
public String qianzhui(String s)
{
String op1="";
String op2="";
String result="";
String token ;
Scanner tokenizer = new Scanner(s);
while (tokenizer.hasNext()) {
token = tokenizer.next();
if (isOpearator(token)) {
op1 = (stack.pop());
op2 = (stack.pop());
result = evalSingleop(token.charAt(0),op2,op1);
stack.push(result);
}
else
stack.push(token);
}
return result;
}
public boolean isOpearator(String token)
{
return (token.equals("+")||token.equals("-")||token.equals("/")||token.equals("*"));
}
public String evalSingleop(char opeation,String op1,String op2)
{
String result = "";
switch (opeation)
{
case add:
result="+"+op1+" "+op2;
break;
case subtract:
result = "-"+op1+" "+op2;
break;
case multiply:
result =("*"+op1)+" "+op2;
break;
case divide:
result = ("/"+op1)+" "+op2;
}
return result;
}
}
Scanner scan = new Scanner(System.in);
Comparebale[] data = new Comparebale[12];
Comparebale target ;
Searching searching = new Searching();
String s = "19 14 23 1 68 20 84 27 55 11 10 79";
String[] n = s.split("\\s");
for(int i = 0;i<n.length;i++)
{
int num = Integer.parseInt(n[i]);
data[i].geti = num;
}
以上就是一个错误的写法,因为虽然我们给datanew了一波,但是这也只是为他提供了12个位置的空间内存而已,而并没有实例化这个对象,正确写法是这样的
Scanner scan = new Scanner(System.in);
Comparebale[] data = new Comparebale[12];
Comparebale target ;
Searching searching = new Searching();
String s = "19 14 23 1 68 20 84 27 55 11 10 79";
String[] n = s.split("\\s");
for(int i = 0;i<n.length;i++)
{
int num = Integer.parseInt(n[i]);
data[i]=new Comparebale(num);
}
即对每一个数组元素都要new一下,这样才能真正的实例化对象,不会造成空指针错误。
public T dequeue() throws EmptyCollectionException{
T s;
if(front == rear)
throw new EmptyCollectionException("队列已空");
else {
s = queue[front];
queue[front]=null;
front=(front+1)%queue.length;
cout--;
}
return s;
}
我原本想的是,如果头指针和尾指针指向同一个方向的时候,那么,这个队列就是一个空队列,但是运行程序的时候我发现队列总是为空,这又是怎么回事呢?debug发现,原来是我的入队代码的原因
public void enqueue(T element) {
if (cout == queue.length)
expandCapacity();
queue[rear] = element;
rear = (rear+1)%queue.length;
cout++;
}
每次新元素入队后,我的尾指针都会向后跳多一位,加入数组个数是10,当到了a[9]的时候,queue[9]=10,接着rear就会跳到开头头指针的位置rear=0,于是rear就和front相等了,从而程序就出现了问题,无论怎样都会显示队列已空。经过思考,我给这个出栈加多了一个限制条件
public T dequeue() throws EmptyCollectionException{
T s;
if(front == rear&&queue[front]==null)
throw new EmptyCollectionException("队列已空");
else {
s = queue[front];
queue[front]=null;
front=(front+1)%queue.length;
cout--;
}
return s;
}
这样,代码就可以照常运转了。
《代码队列问题3》
(statistics.sh脚本的运行结果截图)
上周无考试
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 623/1000 | 3/7 | 22/60 | |
第四周 | 600/1600 | 2/9 | 22/82 | |
第五周 | 1552/2987 | 2/11 | 22/94 | |
第六周 | 892/3879 | 2/11 | 22/114 | |
第七周 | 2284/6163 | 2/13 | 22/134 |
计划学习时间:10小时
实际学习时间:8小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
原文:https://www.cnblogs.com/yangkaihan/p/11781409.html