java栈-栈实现回文数和字符串计算

在这里插入图片描述
先进来的最后出去,后进来的先出去。

放元素: 压栈 push
取元素: 出栈/弹栈。 pop

操作是针对 栈顶。栈底不允许做。

在这里插入图片描述
压栈 和 弹栈
在这里插入图片描述
可以类比 为 手枪 上子弹,子弹发射。

栈的实现

任何表都可以 用来实现 栈。
主要的两种方式: 链表 和 数组。

链表实现栈

动态栈: 使用 链表 实现 栈
特点: 元素 和 元素 间 ,物理上不连续,但是功能受限。
只能在 栈顶 进行 插入 和 删除, 栈尾 不允许 操作。

数组实现栈

静态栈: 使用 数组 实现 栈

栈的应用场景

子程序的调用
处理递归
表达式转换
二叉树遍历
图形的深度优先遍历DFS(depth first)
在这里插入图片描述

栈入门

在这里插入图片描述

/*


*/
public class ArrayStack {

  //  栈的大小
  private int maxStack;

  private int[] stack;

//  表示栈顶所在的位置,默认情况下没有数据,使用-1
  private int top = -1;

  public ArrayStack(int maxStack){
    this.maxStack = maxStack;
  }
  /*
  1.压栈
  2.弹栈
  3.判断是否空栈
  4.当前栈中是否满栈
   */
//  当前栈中是否满栈
  public boolean isFull(){
    return this.top == this.maxStack - 1;
  }

//  是否空栈
  public boolean isEmpty(){
    return this.top == -1;
  }

//  压栈:
  public void push(int val){

    // 判断是否满栈
    if(isFull()){
      throw new RuntimeException("此栈已满!");
    }

    top ++;
    stack[top] = val;
  }

//  弹栈
  public int pop(){
    //如果栈是空的
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    int value = stack[top];
    top --;
    return value;
  }

// 查看栈中所有元素
  public void list(){
    //判断是否空栈
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    for (int i = 0; i < stack.length; i ++){
      System.out.printf("stack[%d] = %d\n", i,stack[i]);
    }
  }
}

使用栈 实现回文数

/*


*/
public class ArrayStack {


  private int maxStack;//  栈的大小
  private int[] stack;
  private int top = -1;//  表示栈顶所在的位置,默认情况下没有数据,使用-1

  public ArrayStack(int maxStack){
    this.maxStack = maxStack;
    stack = new int[maxStack];
  }
  /*
  1.压栈
  2.弹栈
  3.判断是否空栈
  4.当前栈中是否满栈
   */
//  当前栈中是否满栈
  public boolean isFull(){
    return this.top == this.maxStack - 1;
  }

//  是否空栈
  public boolean isEmpty(){
    return this.top == -1;
  }

//  压栈:
  public void push(int val){

    // 判断是否满栈
    if(isFull()){
      throw new RuntimeException("此栈已满!");
    }

    top ++;
    stack[top] = val;
  }

//  弹栈
  public int pop(){
    //如果栈是空的
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    int value = stack[top];
    top --;
    return value;
  }

// 查看栈中所有元素
  public void list(){
    //判断是否空栈
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    for (int i = 0; i < stack.length; i ++){
      System.out.printf("stack[%d] = %d\n", i,stack[i]);
    }
  }

//  栈中元素存在的个数
  public int length(){
    return this.top + 1;
  }
}


public class TestApp {
  public static void main(String[] args) {
  /*
  回文数据
  回文: aba
  需求:通过 之前创建的栈 来判断一个数字是否是回文数据
   */



    System.out.println(detecation("hello"));
    System.out.println(detecation("aba"));
    System.out.println(detecation("ab123123123a"));
  }
  public static boolean detecation(String val){
//      初始化栈对象
//      获取字符串长度
      int length = val.length();
      ArrayStack arrayStack = new ArrayStack(length);
//      把字符串的数据 一个一个 压栈到数组中
      for(int i = 0; i < length; i++){
          arrayStack.push(val.charAt(i));
      }

      String newVal = "";
      int length1 = arrayStack.length();
      for (int i = 0; i < length1; i++){
          // 是否是一个空栈
          if (!arrayStack.isEmpty()){
              char pop = (char)arrayStack.pop();
              newVal += pop;
          }
      }

      if (val.equals(newVal)){
          return true;
      } else {
          return false;
      }
  }
}

使用 栈 完成 字符串 计算

在这里插入图片描述
步骤:

  1. 循环遍历出 每一个元素
  2. 如果是数字,压入 数字栈。如果是 符号, 压入 符号栈。
  3. 如果符号:
    如果符号栈为空,则符号立即入栈。
    如果符号栈不为空,先去对比栈中 符号的优先级。如果优先级小于等于 栈中的符号,应该需要先计算 原来 数字栈中的数据,将得到的结果再次入栈。入栈之后,在把符号入 符号栈。如果优先级 大于 原来符号栈中符号,直接将符号入栈即可。
    最终获取一个表达式结果。

stack 的源代码

/*


*/
public class ArrayStack {


  private int maxStack;//  栈的大小
  private int[] stack;
  private int top = -1;//  表示栈顶所在的位置,默认情况下没有数据,使用-1

  // constructor
  public ArrayStack(int maxStack){
    this.maxStack = maxStack;
    this.stack = new int[this.maxStack];
  }

//  当前栈中是否满栈
  public boolean isFull(){
    return this.top == this.maxStack - 1;
  }

//  是否空栈
  public boolean isEmpty(){
    return this.top == -1;
  }

//  压栈
  public void push(int val){

    // 判断是否满栈
    if(isFull()){
      throw new RuntimeException("此栈已满!");
    }

    top ++;
    stack[top] = val;
  }

//  弹栈
  public int pop(){
    //如果栈是空的
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    int value = stack[top];
    top --;
    return value;
  }

// 查看栈中所有元素
  public void list(){
    //判断是否空栈
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    for (int i = 0; i < stack.length; i ++){
      System.out.printf("stack[%d] = %d\n", i,stack[i]);
    }
  }

//  栈中元素存在的个数
  public int length(){
    return this.top + 1;
  }

//  判断是否是一个运算符
  public boolean isOper(char v){
    return v == '+' || v == '-' || v == '*' || v == '/';
  }

//  判断运算符优先级 使用数字表示优先级大小,数字越大的,优先级也越大
  public int priority(int oper){
    if (oper == '*' || oper == '/'){
      return 1;
    } else if (oper == '+' || oper == '-'){
      return 0;
    }
    // 其他运算符,不作为计算
    return -1;
  }

// 获取栈的容量
  public int stackLength(){
    return this.stack.length;
  }

// 获取栈顶数据
  public int peek(){
    return this.stack[top];
  }

//  计算两个数进行运算后的结果
  public int calculate(int num1, int num2, int oper){
    // 2 + 3
    // num1: 3; num2 : 2
    int result = 0;
    switch (oper){
      case '+':
        result = num1 + num2;
        break;
      case '-':
        result = num2 - num1;
        break;
      case '*':
        result = num1 * num2;
        break;
      case '/':
        result = num2 / num1;
        break;
      default:
        break;
      }

    return result;
 }
}



使用stack 对 str进行 计算

/*


*/
public class ArrayStack {


  private int maxStack;//  栈的大小
  private int[] stack;
  private int top = -1;//  表示栈顶所在的位置,默认情况下没有数据,使用-1

  // constructor
  public ArrayStack(int maxStack){
    this.maxStack = maxStack;
    this.stack = new int[this.maxStack];
  }

//  当前栈中是否满栈
  public boolean isFull(){
    return this.top == this.maxStack - 1;
  }

//  是否空栈
  public boolean isEmpty(){
    return this.top == -1;
  }

//  压栈
  public void push(int val){

    // 判断是否满栈
    if(isFull()){
      throw new RuntimeException("此栈已满!");
    }

    top ++;
    stack[top] = val;
  }

//  弹栈
  public int pop(){
    //如果栈是空的
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    int value = stack[top];
    top --;
    return value;
  }

// 查看栈中所有元素
  public void list(){
    //判断是否空栈
    if(isEmpty()){
      throw new RuntimeException("空栈,未找到数据!");
    }

    for (int i = 0; i < stack.length; i ++){
      System.out.printf("stack[%d] = %d\n", i,stack[i]);
    }
  }

//  栈中元素存在的个数
  public int length(){
    return this.top + 1;
  }

//  判断是否是一个运算符
  public boolean isOper(char v){
    return v == '+' || v == '-' || v == '*' || v == '/';
  }

//  判断运算符优先级 使用数字表示优先级大小,数字越大的,优先级也越大
  public int priority(int oper){
    if (oper == '*' || oper == '/'){
      return 1;
    } else if (oper == '+' || oper == '-'){
      return 0;
    }
    // 其他运算符,不作为计算
    return -1;
  }

// 获取栈的容量
  public int stackLength(){
    return this.stack.length;
  }

// 获取栈顶数据
  public int peek(){
    return this.stack[top];
  }

//  计算两个数进行运算后的结果
  public int calculate(int num1, int num2, int oper){
    // 2 + 3
    // num1: 3; num2 : 2
    int result = 0;
    switch (oper){
      case '+':
        result = num1 + num2;
        break;
      case '-':
        result = num2 - num1;
        break;
      case '*':
        result = num1 * num2;
        break;
      case '/':
        result = num2 / num1;
        break;
      default:
        break;
      }

    return result;
 }
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你编写这个程序。以下是使用顺序判断回文字符串的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxSize 100 typedef struct { char data[MaxSize]; int top; } SqStack; // 初始化 void InitStack(SqStack *S) { S->top = -1; } // 判断是否为空 int StackEmpty(SqStack S) { if (S.top == -1) { return 1; } else { return 0; } } // 入 int Push(SqStack *S, char x) { if (S->top == MaxSize - 1) { return 0; } S->top++; S->data[S->top] = x; return 1; } // 出 int Pop(SqStack *S, char *x) { if (S->top == -1) { return 0; } *x = S->data[S->top]; S->top--; return 1; } // 判断字符串是否为回文 int IsPalindrome(char *str) { SqStack S; InitStack(&S); int len = strlen(str); int i; for (i = 0; i < len / 2; i++) { Push(&S, str[i]); } if (len % 2 != 0) { i++; } char x; while (i < len) { Pop(&S, &x); if (x != str[i]) { return 0; } i++; } return 1; } int main() { char str[MaxSize]; printf("请输入一个字符串:"); scanf("%s", str); if (IsPalindrome(str)) { printf("%s 是回文字符串\n", str); } else { printf("%s 不是回文字符串\n", str); } return 0; } ``` 这个程序使用顺序来判断字符串是否为回文字符串。首先将字符串的前一半字符入,然后依次弹出顶字符与后一半字符比较,如果相同则继续比较,否则说明字符串不是回文字符串。程序中定义了一个 SqStack 结构体,包含一个字符数组和一个整型变量 top,用于表示顶元素的下标。程序中还包含了一些的基本操作函数,如 InitStack、StackEmpty、Push 和 Pop。最后在主函数中调用了 IsPalindrome 函数来判断输入的字符串是否为回文字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值