根据算法笔记247页的简单计算器的C语言代码(补充了带’()'的)
ps:后面先是C语言再是java的
问题: java 在编写的时候出现了类的浅拷贝和深拷贝。进入队列的深拷贝会将队列的第一个位置和第二个位置(存储的第二个同名的临时存储变量)使用深拷贝会将第一和第二个都变成相同的
#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
#include<queue>
#include<map>
using namespace std;
struct node{
double num; //操作数
char op; //操作字符
bool flag; //true代表操作数 false表示操作符
};
string str;
stack<node> s;
queue<node> q;
map<char,int> op;
void Change(){ //中缀表达式转换为后缀表达式
double num;
node temp;
for(int i=0;i<str.length();){
//printf("%c\n",str[i]);
//cout<< "26"<< " " << str[i] <<"\n";
if(str[i]>='0' && str[i]<='9'){
temp.flag=true; //标记是数字
temp.num = str[i++]-'0';
while(i<str.length()&&str[i]>='0'&&str[i]<='9'){
temp.num=temp.num*10+(str[i]-'0');
i++;
}
if(temp.num==5){
cout<<"5";
}
q.push(temp);
//cout<< "\n" <<q.front().num << "end\n";
}
else{
temp.flag=false;
if(str[i]=='('||str[i]==')'){
// cout<<"sdf";
if(str[i]==')'){
while(s.top().op!='('){
cout<<" 46 "<<s.top().op<<" ";
q.push(s.top());
s.pop();
}
if(s.top().op=='(')
s.pop();
//cout<<"()输出完毕"<<"\n";
}
}
while(!s.empty()&&op[str[i]]<=op[s.top().op]&&op[s.top().op]<3){
q.push(s.top());
s.pop();
}
temp.op=str[i];
if(str[i]==')'){
}else{
s.push(temp);
}
i++;
}
}
while(!s.empty()){
q.push(s.top());
s.pop();
}
}
double Cal(){
double temp1,temp2;
node cur,temp;
while(!q.empty()){
cur=q.front();
q.pop();
if(cur.flag==true){
s.push(cur);
}
else{
temp2=s.top().num;
s.pop();
temp1=s.top().num;
s.pop();
temp.flag=true;
if(cur.op=='+') temp.num=temp1+temp2;
else if(cur.op=='-') temp.num=temp1-temp2;
else if(cur.op=='*') temp.num=temp1*temp2;
else temp.num=temp1/temp2;
cout << temp.num <<"\n";
s.push(temp);
}
}
return s.top().num;
}
int main(){
op['+']=op['-']=1;
op['/']=op['*']=2;
op['(']=op[')']=3;
while(getline(cin,str),str!="0"){
for(string::iterator it=str.end();it!=str.begin();it--){
if(*it==' ') str.erase(it);
}
while(!s.empty()){
s.pop();
}
Change();
printf("%.2f\n",Cal());
}
}
第一个Simple_Cal类
public class Simple_Cal {
//"30/90-26+97-5-6-13/88*6+51/29+79*87+57*92"
public StringBuffer strA=new StringBuffer();
Map<String, Integer> op = new HashMap<>();
Queue<Node> q = new LinkedBlockingQueue<Node>();//后缀表达式序列
Stack<Node> s = new Stack<>();//操作符栈
public static void main(String[] args) {
Simple_Cal simple_cal = new Simple_Cal();
simple_cal.Change();
simple_cal.Cal();
}
public void Change(){ //中缀表达式转换为后缀表达式
System.out.println("hello");
//strA.append("30/90-26+97-5-6-13/88*6+51/29+79*87+57*92");
strA.append("2*(9+6/3-5)+4");
op.put("+",1);
op.put("-",1);
op.put("*",2);
op.put("/",2);
op.put("(",3);
op.put(")",3);
double num;
Node temp = new Node();
for(int i = 0 ;i<strA.length();){
char str=strA.charAt(i);
if(strA.charAt(i)>='0'&&strA.charAt(i)<='9'){
temp.setFalg(true);
temp.setNum(strA.charAt(i)-'0');
i++;
while(i<strA.length()&&strA.charAt(i)>='0'&&strA.charAt(i)<='9'){
temp.setNum(temp.getNum()*10+(strA.charAt(i)-'0'));
i++;
}
System.out.println("52"+temp.toString());
q.offer(temp);
temp = new Node();
}else{
temp.setFalg(false);
if(strA.charAt(i)=='('||strA.charAt(i)==')'){
if(strA.charAt(i)==')'){
System.out.println("67"+s.peek().getOp());
if(s.peek().getOp()!='('){
System.out.println("yes");
}
while (s.peek().getOp()!='('){
q.offer(s.peek());
s.pop();
}
if(s.peek().getOp()=='('){
s.pop();
}
}
}
int ops=op.get(String.valueOf(strA.charAt(i)));
while (!s.empty()&&ops<=op.get(String.valueOf(s.peek().getOp()))&&op.get(String.valueOf(s.peek().getOp()))<3){
q.offer(s.peek());
s.pop();
}
temp.setOp(str);
if(str==')'){
}else {
s.push(temp);
}
System.out.println("操作符");
System.out.println("71"+temp.toString());
temp = new Node();
i++;
}
}
while(!s.empty()){
q.offer(s.peek());
s.pop();
}
System.out.println("===============");
System.out.println(q.size());
for(Node n:q){
if(n.isFalg()){
System.out.println(n.getNum());
}
else {
System.out.println(n.getOp());
}
}
}
public void Cal(){
double temp1,temp2;
Node cur=new Node();
while(!q.isEmpty()){
// cur.setNum(q.peek().getNum());
// cur.setFalg(q.peek().isFalg());
// cur.setOp(q.peek().getOp());
cur=q.peek();
q.remove();
System.out.println("119"+cur.toString());
if(cur.isFalg()==true){
s.push(cur);
System.out.println("s添加了"+cur.toString());
System.out.println("s的栈顶元素是"+s.peek().toString()+"s的大小"+s.size());
for (Node n:s){
System.out.println(n.toString());
}
}else{
Node temp=new Node(); //浅拷贝和深拷贝的问题
temp2=s.peek().getNum();
s.pop();
temp1=s.peek().getNum();
System.out.println("结果是"+" "+temp1+" "+temp2+" "+cur.toString()+ " "+ s.peek().toString());
s.pop();
temp.setFalg(true);
if(cur.getOp()=='+') {
temp.setNum(temp1 + temp2);
}else if(cur.getOp()=='-'){
temp.setNum(temp1-temp2);
}else if(cur.getOp()=='*'){
temp.setNum(temp1*temp2);
}else {
temp.setNum(temp1/temp2);
}
System.out.println("结果是"+temp.getNum()+"\n");
s.push(temp);
}
}
System.out.println(s.peek().getNum());
}
}
第二个Node
package calculator;
public class Node {
private double num;
private char op;
private boolean falg;//true表示操作数,false表示操作符
public double getNum() {
return num;
}
public void setNum(double num) {
this.num = num;
}
public char getOp() {
return op;
}
public void setOp(char op) {
this.op = op;
}
public boolean isFalg() {
return falg;
}
public void setFalg(boolean falg) {
this.falg = falg;
}
@Override
public String toString() {
return "Node{" +
"num=" + num +
", op=" + op +
", falg=" + falg +
'}';
}
}