我的任务是使用整数堆栈来计算给定分子的分子量。我应该自己使用数组来实现IntStack类。然后,我应该去做一个以String作为输入并评估分子的类。输入中的唯一字符将是开括号和闭括号,数字2-9,以及H(氢),C(碳)和O(氧)。我给了这三个元素的分子量分别为1、12和16。

public class IntStack
{
private int[] stack;
public int index;

public IntStack()
{
    stack = new int[100];
    index = -1;
}

public void push(int x)
{
    stack[index + 1] = x;
    index++;
}

public int pop()
{
    if (index == -1)
    {
        return -1;
    }
    int num = stack[index];
    index--;
    return num;
}

public int peek()
{
    if (index == -1)
    {
        return 0;
    }
    return stack[index];
}
}


import java.util.Scanner;

public class MolecularMass
{
 private static IntStack stack;

public static void main(String[] args)
{
stack = new IntStack();
Scanner kb = new Scanner(System.in);
System.out.print("Enter the molecule: ");
String input = kb.nextLine();
int result = evaluate(input);
System.out.println("The Molecular Mass of " + input +  " is " + result);
}

public static int evaluate(String s)
{
int answer = 0;
int num = 0;

for(int i = 0; i < s.length(); i++)
{
  char c = s.charAt(i);
  switch(c)
  {
    case '2':
      num = stack.pop();
      num *= 2;
      stack.push(num);
      break;
    case '3':
      num = stack.pop();
      num *= 3;
      stack.push(num);
      break;
    case '4':
      num = stack.pop();
      num *= 4;
      stack.push(num);
      break;
    case '5':
      num = stack.pop();
      num *= 5;
      stack.push(num);
      break;
    case '6':
      num = stack.pop();
      num *= 6;
      stack.push(num);
      break;
    case '7':
      num = stack.pop();
      num *= 7;
      stack.push(num);
      break;
    case '8':
      num = stack.pop();
      num *= 8;
      stack.push(num);
      break;
    case '9':
      num = stack.pop();
      num *= 9;
      stack.push(num);
      break;
    case 'C':
      stack.push(12);
      break;
    case 'H':
      stack.push(1);
      break;
    case 'O':
      stack.push(16);
      break;
    case '(':
      stack.push(0);
      break;
    case ')':
      int result = 0;
      while(stack.peek() != 0)
      {
        result += stack.pop();
      }
      int throwaway = stack.pop();
      stack.push(result);
      break;
    default:
      break;
  }
}

for(int i = 0; i < stack.index; i++)
{
  answer += stack.pop();
}

return answer;
}
}


它应该运行如下:

输入分子:((CH)2(OH2H)(C(H))O)3

((CH)2(OH2H)(C(H))O)3的分子量为222

我一直保持分子量为0或1

编辑:这是我的评估方法算法:
如果字符是化学元素,则程序会推送该元素的分子量。
如果字符是开括号,则程序将0压入堆栈。
如果字符是圆括号,则程序将加括号内的所有内容加起来,直到到达圆括号为止(存储为0)。
如果字符是数字,则将数字弹出堆栈,将其乘以输入数字,然后将其推回堆栈
最后,它将堆栈中的所有内容相加并返回结果。

最佳答案

假设您正在学习编码的过程中,建议您遵循一个过程来自己发现错误。我建议您采用以下方式:


编写一组单元测试,以确保您的IntStack完全符合您的期望。
evaluate逻辑移到一个单独的类中(使用IntStack作为隐藏的实现详细信息)
提供几种方法来执行evaluate的各个部分,例如element(Character)count(Character)startGroup()endGroup()
创建每种方法时,请创建单元测试,以确保它们完全符合您的期望。
一旦它们都能正常工作,请编写代码以读取输入并调用您编写的各种方法。


这将比您指出错误的时间更长,但我保证您会学到更多。

10-06 14:47