标签:能力 构建 front 攻击 字符串拼接 string 应该 header 定义类
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小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
标签:能力 构建 front 攻击 字符串拼接 string 应该 header 定义类
原文地址:https://www.cnblogs.com/yangkaihan/p/11781409.html