使用Array实现栈

废话不多说先看代码:

class ArrayStack {
    private static final int MAX_SIZE = 1000;
    private int top;
    private int[] stackArray;

    public ArrayStack() {
        this.top = -1;
        this.stackArray = new int[MAX_SIZE];
    }

    // 入栈操作
    public void push(int data) {
        if (top >= MAX_SIZE - 1) {
            System.out.println("Stack overflow");
            return;
        }

        stackArray[++top] = data;
    }

    // 出栈操作
    public int pop() {
        if (isEmpty()) {
            System.out.println("Stack is empty");
            return -1; // 返回一个特定的值表示栈为空
        }

        return stackArray[top--];
    }

    // 查看栈顶元素
    public int peek() {
        if (isEmpty()) {
            System.out.println("Stack is empty");
            return -1; // 返回一个特定的值表示栈为空
        }

        return stackArray[top];
    }

    // 检查栈是否为空
    public boolean isEmpty() {
        return top == -1;
    }

    // 获取栈的大小
    public int getSize() {
        return top + 1;
    }
}

// 示例使用
public class Main {
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);

        System.out.println("Top of the stack: " + stack.peek()); // 输出: 3
        System.out.println("Stack size: " + stack.getSize());    // 输出: 3

        System.out.println("Pop from stack: " + stack.pop());     // 输出: 3
        System.out.println("Top of the stack after pop: " + stack.peek()); // 输出: 2
        System.out.println("Stack size after pop: " + stack.getSize());    // 输出: 2
    }
}

栈是什么呢?栈是一种桶状的容器,先进后出

还有一个自动扩容的版本:

package pro;

public class ArrayStack {
    private int top ;
    private  int MAX_SIZE= 10;
    private int[]arrstack;

    public ArrayStack(){
        //初始化
        this.top=-1;
        this.arrstack = new int[MAX_SIZE];
    }
    public void push(int i){
        if (top+1>=MAX_SIZE){
         //扩容
          getDilatation();
        }
        arrstack[++top]=i;
    }

    public int pop(){
         if (isEmpty()){
             System.out.println("没有数据");
             return -1;
         }
         return arrstack[top--];
    }
    public boolean isEmpty(){
        boolean flag = top == -1;
        return flag;
    }
    //扩容
    private void getDilatation(){
        this.MAX_SIZE = MAX_SIZE*2;
        int[] newarr =new int[MAX_SIZE];
        System.arraycopy(arrstack,0,newarr,0,arrstack.length);
        this.arrstack = newarr;
    }
}

扩容的容器大小是以前的2倍,扩容原理实际上是创建一个新的数组将老数组的数据复制到新数组中,System.arraycopy(arrstack,0,newarr,0,arrstack.length);

System.arraycopy 是 Java 中用于数组复制的底层方法,其实现通常由 Java 虚拟机提供,因此它的具体实现可能会因 JVM 不同而有所差异。在大多数 JVM 中,System.arraycopy 的实现是通过本地方法(native method)来完成的,即通过调用底层的操作系统或者硬件指令来执行数组复制的操作,从而提高效率。

这是他的源码有好奇的小伙伴可以研究一下,众所周知Java的底层是用c实现的所以我就不多说了

JVM_ENTRY(void, JVM_SystemArraycopy(JNIEnv* env, jclass ignored, jobject src, jint src_pos, jobject dest, jint dest_pos, jint length))

  // 省略了部分代码...

  if (src->is_primitive_array() && dest->is_primitive_array()) {
    // 如果是基本类型数组,使用相应的复制操作
    arraycopy_unchecked(src, src_pos, dest, dest_pos, length, CHECK);
  } else {
    // 如果是对象数组,使用 Object.clone 方法
    arraycopy_unchecked_objArray(src, src_pos, dest, dest_pos, length, CHECK);
  }

JVM_END

下面是使用实现简单计算器的 C 语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> // 定义结构体 typedef struct stack { int top; int capacity; int *array; } Stack; // 创建 Stack *createStack(int capacity) { Stack *stack = (Stack *) malloc(sizeof(Stack)); stack->top = -1; stack->capacity = capacity; stack->array = (int *) malloc(capacity * sizeof(int)); return stack; } // 判断是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 判断是否已满 int isFull(Stack *stack) { return stack->top == stack->capacity - 1; } // 入 void push(Stack *stack, int item) { if (isFull(stack)) { printf("已满,无法入\n"); return; } stack->array[++stack->top] = item; } // 出 int pop(Stack *stack) { if (isEmpty(stack)) { printf("为空,无法出\n"); return -1; } return stack->array[stack->top--]; } // 获取顶元素 int peek(Stack *stack) { if (isEmpty(stack)) { printf("为空\n"); return -1; } return stack->array[stack->top]; } // 计算两个数字的结果 int calculate(int num1, int num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: printf("非法操作符\n"); return 0; } } // 计算表达式的值 int evaluate(char *exp) { Stack *stack = createStack(strlen(exp)); int i, num = 0; for (i = 0; exp[i] != '\0'; i++) { if (isdigit(exp[i])) { num = num * 10 + (exp[i] - '0'); } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') { push(stack, num); num = 0; int num1 = pop(stack); int num2 = pop(stack); push(stack, calculate(num2, num1, exp[i])); } else if (exp[i] == ' ') { continue; } else { printf("非法字符\n"); return 0; } } return pop(stack); } // 测试代码 int main() { char exp[100]; printf("请输入表达式:\n"); fgets(exp, 100, stdin); printf("计算结果为:%d\n", evaluate(exp)); return 0; } ``` 这个简单计算器实现了四则运算,支持多位数字和空格,但不支持负数和括号。可以通过输入表达式来计算表达式的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值