链栈源码`
package 计算器;
import java.util.Iterator;
public class Stack<T> implements Iterable<T>{
private Node head;
private int N;
public class Node{
T data;
Node next;
public Node(T data,Node next){
this.data=data;
this.next=next;
}
}
//构造方法
public Stack(){
this.head=new Node(null,null);
this.N=0;
}
//判断当前栈的元素个数是否为0
public boolean isEmpty(){
return N==0;
}
//获取栈中元素个数
public int size(){
return N;
}
//把t元素压入栈(相当于链表的头插法)
public void push(T t){
//首结点指向的第一个元素
Node first=head.next;
Node newNode = new Node(t, null);
//首结点指向新结点
head.next=newNode;
//新结点指向原来的第一节点first
newNode.next=first;
//元素个数加1
N++;
}
//把元素弹出栈
public T pop(){
//找到首结点的下一个结点
Node first=head.next;
if(first==null){
return null;
}
head.next=first.next;
//元素个数-1
N--;
return first.data;
}
public T peek(){
Node first=head.next;
if(first==null){
return null;
}
return first.data;
}
@Override
public Iterator<T> iterator() {
return new SIterator();
}
private class SIterator implements Iterator{
private Node n;
public SIterator(){
this.n=head;
}
@Override
public boolean hasNext() {
return n.next!=null;
}
@Override
public Object next() {
n=n.next;
return n.data;
}
}
}
计算器源码`
package 计算器;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.Objects;
public class TEST {
public static void main(String[] args){
JFrame jf = new JFrame("计算器");
jf.setSize(600,500);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel(null);
JTextArea text = new JTextArea();
text.setLocation(20,10);
text.setSize(350,50);
panel.add(text);
JTextArea text_01 = new JTextArea();
text_01.setBounds(20,70,350,50);
panel.add(text_01);
JTextArea text_03 = new JTextArea();
text_03.setLocation(380,10);
text_03.setSize(190,410);
panel.add(text_03);
JButton jb1 = new JButton("(");
jb1.setBounds(20,130,50,50);
jb1.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("(")){
String str = text.getText();
if(Objects.equals(str, "")){
text.append("()");
}
else {
if(str.charAt(str.length()-1) != '.' && str.charAt(str.length()-1) != ')' ){
text.append("(");
}
}
}
}
});
panel.add(jb1);
JButton jb2 = new JButton(")");
jb2.setBounds(95,130,50,50);
jb2.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals(")")){
String str = text.getText();
for(int i=str.length()-1;i>=0;i--){
char x = str.charAt(i);
if(x == ')'){
break;
}
else {
if( x == '('){
text.append(")");
}
}
}
}
}
});
panel.add(jb2);
JButton jb3 = new JButton("%");
jb3.setBounds(170,130,50,50);
panel.add(jb3);
jb3.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("%")){
String str = text.getText();
if(issames(str)){
text.append("%");
}
}
}
});
JButton jb4 = new JButton("BACKSP");
jb4.setBounds(245,130,125,50);
panel.add(jb4);
jb4.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("BACKSP")){
String str = text.getText();
text.setText("");
str = str.substring(0, str.length() - 1);
text.append(str);
}
}
});
JButton jb6 = new JButton("1");
jb6.setBounds(20,190,50,50);
panel.add(jb6);
jb6.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("1")){
text.append("1");
}
}
});
JButton jb7 = new JButton("2");
jb7.setBounds(95,190,50,50);
panel.add(jb7);
jb7.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("2")){
text.append("2");
}
}
});
JButton jb8 = new JButton("3");
jb8.setBounds(170,190,50,50);
panel.add(jb8);
jb8.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("3")){
text.append("3");
}
}
});
JButton jb9 = new JButton("+");
jb9.setBounds(245,190,125,50);
panel.add(jb9);
jb9.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("+")){
String str = text.getText();
if(issames(str)){
text.append("+");
}
}
}
});
JButton jb11 = new JButton("4");
jb11.setBounds(20,250,50,50);
panel.add(jb11);
jb11.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("4")){
text.append("4");
}
}
});
JButton jb12 = new JButton("5");
jb12.setBounds(95,250,50,50);
panel.add(jb12);
jb12.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("5")){
text.append("5");
}
}
});
JButton jb13 = new JButton("6");
jb13.setBounds(170,250,50,50);
panel.add(jb13);
jb13.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("6")){
text.append("6");
}
}
});
JButton jb15 = new JButton("C");
jb15.setBounds(245,250,125,50);
panel.add(jb15);
jb15.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("C")){
text.setText("");
text_01.setText("");
}
}
});
JButton jb16 = new JButton("7");
jb16.setBounds(20,310,50,50);
panel.add(jb16);
jb16.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("7")){
text.append("7");
}
}
});
JButton jb17 = new JButton("8");
jb17.setBounds(95,310,50,50);
panel.add(jb17);
jb17.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("8")){
text.append("8");
}
}
});
JButton jb18 = new JButton("9");
jb18.setBounds(170,310,50,50);
panel.add(jb18);
jb18.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("9")){
text.append("9");
}
}
});
JButton jb19 = new JButton("-");
jb19.setBounds(245,310,50,50);
panel.add(jb19);
jb19.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("-")){
String str = text.getText();
if(Objects.equals(str, "")){
text.append("-");
}
else {
if(issames(str) || str.charAt(str.length()-1) == ')'){
text.append("-");
}
}
}
}
});
JButton jb21 = new JButton(".");
jb21.setBounds(20,370,50,50);
panel.add(jb21);
jb21.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(".")) {
String str = text.getText();
char c = str.charAt(str.length() - 1);
if (c >= '0' && c <= '9') {
for (int i = str.length() - 1; i >= 0; i--) {
char c_1 = str.charAt(i);
boolean swr = (c_1 >= '0' && c_1 <= '9');
if (!swr) {
if (str.charAt(i) != '.') {
text.append(".");
break;
}
}
if (i == 0) {
text.append(".");
}
}
}
}
}
});
JButton jb22 = new JButton("0");
jb22.setBounds(95,370,50,50);
panel.add(jb22);
jb22.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("0")){
text.append("0");
}
}
});
JButton jb23 = new JButton("/");
jb23.setBounds(170,370,50,50);
panel.add(jb23);
jb23.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("/")){
String str = text.getText();
if(issames(str)){
text.append("/");
}
}
}
});
JButton jb24 = new JButton("*");
jb24.setBounds(245,370,50,50);
panel.add(jb24);
jb24.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("*")){
String str = text.getText();
if(issames(str)){
text.append("*");
}
}
}
});
JButton jb25 = new JButton("=");
jb25.setBounds(320,310,50,110);
panel.add(jb25);
jb25.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
text_01.setText("");
String Arithmetic = text.getText();
text_01.append(Arithmetic);
text_03.append("\n" + Arithmetic);
text.setText("");
Stack<Character> OP = new Stack<Character>();
Stack<Double> OPnd = new Stack<Double>();
OP.push('#');
char[] Operation_characters = Arithmetic.toCharArray();
for (int i =0; i < Arithmetic.length(); i++) {
if(Operation_characters[i] == '('){//左括号直接入栈
OP.push(Operation_characters[i]);
}
else {
if (issames(Operation_characters[i])) {//判断是否是数字或者小数点
String x_1 = "";
x_1 = x_1 + Operation_characters[i];
double y_1;
for (int j = i+1; j < Arithmetic.length(); j++) {//把数double 数压入OPnd栈里面
if(j ==Arithmetic.length()-1){
if (issames(Operation_characters[j])){
x_1 = x_1 + Operation_characters[j];
i=j;
}
else {
i = j-1;
break;
}
}else {
if (issames(Operation_characters[j])) {
x_1 = x_1 + Operation_characters[j];
}
else {
i = j-1;
break;
}
}
}
y_1 = Double.parseDouble(x_1);
OPnd.push(y_1);
}
else {
if(isop(Operation_characters[i])){//判断是否是运算符
char op = OP.peek();
boolean po = Compare_priorities(Operation_characters[i], op);//比较当前操作符和OP的栈顶元素的优先级大小
if (Operation_characters[i] == ')') {//先处理)
while (OP.peek() != '(') {
double s1 = OPnd.peek();
OPnd.pop();
double s2 = OPnd.peek();
OPnd.pop();
char c = OP.peek();
OP.pop();
//将结果压栈
OPnd.push(operation(s2, s1, c));
}
OP.pop();//把(弹出OP栈
}
else {
if (po) {
OP.push(Operation_characters[i]);//优先级高于栈顶入OP栈
}
else {
if(OP.peek() == '#'){
break;
}
else {
double s1 = OPnd.peek();
OPnd.pop();
double s2 = OPnd.peek();
OPnd.pop();
char c = OP.peek();
OP.pop();
//将结果压栈
OPnd.push(operation(s2, s1, c));
OP.push(Operation_characters[i]);
}
}
}
}
}
}
}
while (OP.peek() != '#') {
//取两个操作数和一个操作符计算
double s1 = OPnd.peek();
OPnd.pop();
double s2 = OPnd.peek();
OPnd.pop();
char c = OP.peek();
OP.pop();
//将结果压栈
OPnd.push(operation(s2, s1, c));
}
double result =OPnd.peek();
OPnd.pop();
text.append(String.valueOf(result));
text_03.append("\n" + String.valueOf(result));
}
});
jf.add(panel);
jf.setVisible(true);
}
/**
* 判断str的最后一个是否为数字或右括号
* @param str 字符串
* @return 是返回false否则返回true
*/
public static boolean issames(String str){
char[] Operation_characters = str.toCharArray();
return (Operation_characters[str.length() - 1] >= '0' && Operation_characters[str.length() - 1] <= '9') || Operation_characters[str.length()-1] == ')' ;
}
/**
* 判断是否是数字和小数点
* @param str 字符串
* @return 是返回true,否则false
*/
public static boolean issames(char str){
return (str >= '0' && str <= '9') || str == '.';
}
/**
* 判断优先级
* @param x 运算符
* @return 返回int形,即运算符x的优先级
*/
public static int priorities(char x){
if(x == '+' || x== '-' ){
return 1;
} else if (x == '*' || x== '/' || x == '%') {
return 2;
} else if (x == '(') {
return 0;
} else if (x == ')') {
return 0;
} else if (x == '#') {
return -1;
}
return 4;
}
/**
*判断优先级大小,x大于y返回true
* @param x 运算符
* @param y 运算符
* @return x的优先级大于y返回true;否则false
*/
public static boolean Compare_priorities(char x,char y){
int a = priorities(x);
int b = priorities(y);
if(x=='(' && y=='('){
return false;
}
else {
return a > b || a == b;
}
}
/**
* 判断字符是否是运算符
* @param c 字符
* @return 是返回true,否则返回false
*/
public static boolean isop(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#' || c == '%';
}
/**
* 求数1 运算符 数2 的结果
* @param str1 数1
* @param str2 数2
* @param x 运算符
* @return 结果
*/
public static Double operation(double str1,double str2,char x){
double result = 0.00;
double a = str1;
double b = str2;
int c=0,d=0,e=0,f=0;//用来解决两个double数相乘出现很多小数点的问题
String str = String.valueOf(str1);
String str_1 = String.valueOf(str2);
for(int i=0;i<str.length();i++){
if(str.charAt(i) == '.'){
d = i;
break;
}
}
c= (int)(a*mi(d));
for(int i=0;i<str_1.length();i++){
if(str_1.charAt(i) == '.'){
f = i;
break;
}
}
e = (int)(b*mi(f));
if (x == '+') {
result = a + b;
} else if (x == '-') {
result = a - b ;
} else if (x == '*') {
result = (double) c * e /mi(d+f);
} else if (x == '/') {
result = a / b;
} else if (x == '%') {
result = a % b;
}
return result;
}
/**
* 求10的k次幂
* @param k 幂
* @return 10的k次幂
*/
public static int mi(int k){
int x = 1;
for(int i=0;i<k;i++){
x = x*10;
}
return x;
}
}