IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单向链表构建的栈和字符串计算器 -> 正文阅读

[数据结构与算法]单向链表构建的栈和字符串计算器

栈:

public class StackAsLinked<TT> {
    int size=10;
    Node1 back;
    Node1 fanhui;
    Node1 n0=new Node1 ( null );
    int count=0;


    public static void main ( String[] args ) {
        StackAsLinked s2 = new StackAsLinked ();
        Scanner s1 = new Scanner ( System.in );
        while ( true ) {
            System.out.println ( "push" );
            System.out.println ( "pop" );
            System.out.println ( "show" );
            System.out.println ( "exit" );
            String str = s1.next ( );
            switch ( str ) {
                case "p":
                    System.out.println ( "请输入要存的数" );
                    s2.push ( s1.nextInt ( ) );
                    break;
                case "po":
                    s2.pop ( );
                    System.out.println ("删除成功" );
                    break;
                case "s":
                    s2.show ( );
                    break;
                case "e":
                    s1.close ();
                    System.out.println ("退出成功" );
                    System.exit ( 0 );
            }

        }
    }




    public void push(TT i){
        if(isfull ()){
            System.out.println ("满了" );
            return;
        }else {
            Node1 nn = new Node1 ( i );
            nn.next=n0.next;
            n0.next = nn;
            count++;
            back=nn;
        }
    }

    public TT pop(){
        if(isEmpty ()){
            System.out.println ("空了" );
           return null;
        }else{
            fanhui=n0.next;
            n0.next=n0.next.next;
            count--;
            return fanhui.no;
        }

    }
    public void show(){
        Node1 temp=n0.next;
        if(isEmpty ()){
            System.out.println ("空了" );
            return;
        }else{
            while ( true ) {
                System.out.println (" "+temp.no );
                temp =temp.next;
                if(temp==null)
                    break;
            }
        }
    }

    public boolean isEmpty ( ) {
        return n0.next==null;
    }

    public boolean isfull ( ) {
        if ( count == size  ) {
            return true;
        }
        return false;
    }

    class Node1{
        Node1 next=null;
        TT no;

        public Node1 ( TT no ) {
            this.no = no;
        }
    }


}

基于栈的计算器(可进行多位数运算)除法是整形取模,会存在误差。

public class Jisuanqi {
    String str="3+200*2-2";
    StackAsLinked<Integer> numStack = new StackAsLinked<> ();
    StackAsLinked<Character> proStack = new StackAsLinked<> ();
    public static void main ( String[] args ) {
        Jisuanqi j1 = new Jisuanqi ();
        j1.run ();
        }

  public boolean ispro(char c1){
      if(c1=='+'||c1=='-'||c1=='*'||c1=='/'){
          return true;
      }
      return false;
  }


    public int order ( char c1 ) {
        if ( c1 == '+' || c1 == '-' ) {
            return 1;
        } else if ( c1 == '*' || c1 == '/' ) {
            return 2;
        }
        return -1;
  }

  public void run() {
      //定义一个下标来取字符
      int index = 0;
      char pro;
      int num1;
      int num2;
      int sum = 0;
      int x=0;
      boolean bb=false;
      char c1;
      while ( true ) {
          //如果index位于最后一个了,就直接跳出循环了,遍历完成.
          if ( index == str.length ( ) ) {
              System.out.println ( "遍历完成" );
              break;
          }
          c1 = str.charAt ( index++ );
          //取出字符为空,继续取下一个
          if ( c1 == ' ' )
              continue;
          //如果字符为符号,准备存入符号栈中
          if ( ispro ( c1 ) ) {

              if(bb){
                  numStack.push (x);
                  bb=false;
              }
              //存入前判断符号栈是不是空的,是空的直接添加,不是空的就继续判断
              if ( proStack.count == 0 ) {
                  proStack.push ( c1 );
                  continue;
              }
              //判断运算次序,新加入的运算符顺序高于等于栈中第一个,直接加入
              if ( order ( c1 ) >= order ( proStack.back.no ) ) {
                  proStack.push ( c1 );
                  //运算符低于栈中第一个,先运算再加入
              } else {
                  //取出两个数字和运算符进行运算
                  num1 = numStack.pop ( );
                  num2 = numStack.pop ( );
                  pro = proStack.pop ( );
                  switch ( pro ) {
                      case '+':
                          sum = num1 + num2;
                          break;
                      case '-':
                          sum = num2 - num1;
                          break;
                      case '*':
                          sum = num2 * num1;
                          break;
                      case '/':
                          if ( num1 == 0 ) {
                              System.out.println ( "错误,除数不能为0" );
                              return;
                          }
                          sum = num2 / num1;
                          break;
                  }
                  //把计算结果放入栈,之后把运算符放进去
                  numStack.push ( sum );
                  proStack.push ( c1 );
              }

          }
          //如果字符不是符号,存入数字栈中
          else {
                //将数据暂存
              if ( ! bb ) {
                  x = Integer.valueOf ( c1 ) - 48;
                  bb = true;
              } else {
                  x = x * 10 + ( Integer.valueOf ( c1 ) - 48 );
              }

          }
      }
      if(bb){
          numStack.push (x);
          bb=false;
      }
      //现在遍历完成,将现有栈中的数据计算出结果就行了
      while ( true ) {
          if ( proStack.count!=0) {
              num1 = numStack.pop ( );
              num2 = numStack.pop ( );
              pro = proStack.pop ( );
              sum = jisuan ( num1 , num2 , pro );

              numStack.push ( sum );
          }else{
              System.out.println ("计算结果"+numStack.pop () );
              break;
          }
      }
  }

public int jisuan(int num01,int num02,char pro1){
    char pro=pro1;
    int num1=num01;
    int num2=num02;
    int sum=0;

    switch ( pro ){
        case'+':
            sum=num1+num2;
            break;
        case'-':
            sum=num2-num1;
            break;
        case'*':
            sum=num2*num1;
            break;
        case'/':
            if(num1==0){
               throw new RuntimeException ( "错误,除数不能为0" );
            }
            sum=num2/num1;
            break;
    }
    //把计算结果输出
    return sum;
}

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:11:23  更:2021-09-30 12:13:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:11:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码