char型与int型之间算术运算问题

图片说明

最后运算结果为173 具体是怎么算出来的啊

c c++

4个回答

unsigend char表示0到255的数,7.4.1.254这里1-3=254.再次到这里应该是8.5.2.255最后才能循环到0,一共循环次数(256*2+7)/3次,所以结果为173

循环中i变成负数了,unsigne是无符号的,会给你转成整数的值

ascii码直接对应

i=7,4,1,126(-2),123,120,...,0

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
数据结构用栈实现算术表达式的求值运算
小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因 附上代码和截图:![图片说明](https://img-ask.csdn.net/upload/201511/16/1447681940_987141.png) #include<malloc.h> #include<stdlib.h> #include<stdio.h> #define STACK_INIT_SIZE 100 //存储空间初始分配量; #define S 10 //存储空间分配增量; #define OK 1 #define ERROR 0 typedef int ElemType; typedef struct{ char *base; char *top; int stacksize; }sqstack; //定义运算符类型栈; typedef struct{ int *base; int *top; int stacksize; }stack; //定义运算数栈; void InitStack(sqstack &OPTR) //构建运算符栈; { OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!OPTR.base) printf("Error!\n"); OPTR.top=OPTR.base; OPTR.stacksize=STACK_INIT_SIZE; return; } void Initstack(stack &OPND) //构建运算数栈; { OPND.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!OPND.base) printf("ERror!"); OPND.top=OPND.base; OPND.stacksize=STACK_INIT_SIZE; return; } int In(char ch) //判断字符是否是运算符; { int r; switch(ch) { case '+': case '-': case '*': case '/': case '#':r=1;break; default:r=0;break; } return r; } void PuSh(sqstack &OPTR,char ch) //运算符栈插入新的运算符栈顶元素; { if(OPTR.top-OPTR.base>=OPTR.stacksize) //栈满,追加存储空间; { OPTR.base=(char *)realloc(OPTR.base,(OPTR.stacksize+S)*sizeof(char)); if(!OPTR.base) printf("错误!"); OPTR.top=OPTR.base+OPTR.stacksize; OPTR.stacksize+=S; } *OPTR.top++=ch; printf("成功插入(puSh)运算符栈顶元素!\n"); } void PoP(sqstack &OPTR,char &ch) //删除字符的栈顶元素;(!!!!!!!!!!!!!!) { if(OPTR.top==OPTR.base) printf("error"); ch=* --OPTR.top; printf("删除字符栈顶元素!\n"); } char GetTop(sqstack &OPTR) //得到运算符栈顶元素;(!!!!!!!!!!!!!) { char c; if(OPTR.top==OPTR.base) printf("error!"); c=*(OPTR.top-1); printf("运算符栈顶元素正常\n"); return c; } void Push(stack &OPND,int e) //运算数栈插入新的运算数栈顶元素; { if(OPND.top-OPND.base>=OPND.stacksize) //栈满,追加空间; { OPND.base=(int *)realloc(OPND.base,(OPND.stacksize+S)*sizeof(int)); if(!OPND.base) printf("运算数栈错误!"); OPND.top=OPND.base+OPND.stacksize; OPND.stacksize+=S; } *OPND.top++=e; printf("成功插入运算数栈!\n"); } void Pop(stack &OPND,int &e) //删除运算数栈的栈顶元素;(!!!!!!!!!!!!!!!) { if(OPND.top==OPND.base) printf("error"); e=* --OPND.top; printf("成功删除运算数栈!"); } int Gettop(stack &OPND) //得到运算数栈顶元素;(!!!!!!!!!!!!!!!!!!) { int a; if(OPND.top==OPND.base) return 0; else a=*(OPND.top-1); return a; } char compare(char a,char b) //判断运算符的优先级; { int i,j; int array[7][7]= //1表示">",-1表示"<",0表示"=",2表示不可能 { {1,1,-1,-1,-1,1,1}, {1,1,-1,-1,-1,1,1}, {1,1,1,1,-1,1,1}, {1,1,1,1,-1,1,1}, {-1,-1,-1,-1,-1,0,2}, {1,1,1,1,2,1,1}, {-1,-1,-1,-1,-1,2,0} }; switch(a) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '(':i=4;break; case ')':i=5;break; case '#':i=6;break; } switch(b) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '(':j=4;break; case ')':j=5;break; case '#':j=6;break; } if(array[i][j]==1) return '>'; else if(array[i][j]==-1) return '<'; else if(array[i][j]==0) return '='; else printf("error!"); printf("该函数被调用"); return 1; } int operate(int p,char f,int q) { switch(f) { case '+':return p+q; case '-':return p-q; case '*':return p*q; case '/':return p/q; } return 1; } int EvaluateExpression() { char c,f, d[100],e; int i, num, tmpa, tmpb; sqstack OPTR; stack OPND; InitStack(OPTR);Initstack(OPND); PuSh(OPTR,'#'); c=getchar(); while(c!='#'||(e=GetTop(OPTR))!='#') { if(c>='0'&&c<='9') { i=0; do{ d[i++]=c; c=getchar(); }while(c>='0'&&c<='9'); d[i]='\0'; num=atoi(d); Push(OPND, num); } else if(In(c)) { switch(compare(GetTop(OPTR), c)) { case '<': PuSh(OPTR, c);c=getchar(); break; case '=': PoP(OPTR, f);c=getchar(); break; case '>': PoP(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa); Push(OPND, operate(tmpa, f, tmpb)); break; } } } return Gettop(OPND); } int EvaluateExpression(); //主操作函数 void main() { int r; printf("请输入表达式:"); r=EvaluateExpression(); printf("输出结果为:%d\n",r); }
栈的问题,用栈编写一个算术表达式求值
用栈做一个简单的算术运算,我觉得思想没问题,可是编译不过去,上网找了很多资料,觉得是栈的基本操作有问题,初始化有问题,可具体是什么错误我也不是很了解,求大神指教!! #include<stdio.h> #include<stdlib.h> typedef struct { int data[100]; int top1; }SqStack1; typedef struct { char suanfu[100]; int top2; }SqStack2; SqStack1 shuzi; SqStack2 zifu; char zcsuanfu; int chushihua1(SqStack1 *shuzi) { if((shuzi=(SqStack1*)malloc(sizeof(SqStack1)))==NULL) return 0; shuzi->top1=-1; return 1; } int chushihua2(SqStack2 *zifu) { if((zifu=(SqStack2*)malloc(sizeof(SqStack2)))==NULL) return 0; zifu->top2=0; zifu->suanfu[0]='='; return 1; } int panzhankong1(SqStack1 *shuzi) { if(shuzi->top1==-1) return 1; else return 0; printf("判栈空1成功\0"); } int panzhankong2(SqStack2 *zifu) { if(zifu->top2==-1) return 1; else return 0; printf("判栈空2成功\0"); } int jinzhan1(SqStack1 *shuzi,int a) { shuzi->top1++; shuzi->data[shuzi->top1]=a; return 1; printf("数字进站成功\0"); } int jinzhan2(SqStack2 *zifu,char a) { zifu->top2++; zifu->suanfu[zifu->top2]=a; return 1; printf("字符进站成功\0"); } int chuzhan1(SqStack1 *shuzi,int *a) { if(panzhankong1(shuzi)) return 0; *a=shuzi->data[shuzi->top1]; shuzi->top1--; return 1; } int chuzhan2(SqStack2 *zifu,char *a) { if(panzhankong2(zifu)) return 0; *a=zifu->suanfu[zifu->top2]; zifu->top2--; return 1; } void suanfubijiao(char a,char b,SqStack1 *shuzi,SqStack2 *zifu) { void shuchujieguo(int i); int i; switch(a) { case'+': case'-': if((b=='*')||(b=='/')||(b=='(')) i=1; else i=3; break; case'*': case'/': if(b=='(') i=1; else i=3; break; case'(': if(b=='=') printf("输入有误"); else if(b==')') i=2; else i=1;break; case')': if(b=='(') printf("输入有误"); else i=3;break; case'=': if(b=='=') i=2; else if(b==')') printf("输入有误"); else i=1;break; default:printf("有误");break; } shuchujieguo(i,shuzi,zifu); } void shuchujieguo(int i,SqStack1 *shuzi,SqStack2 *zifu) { int jisuanjieguo(int a,char ch,int b); char ch; int a,b,c; if(i==3) {chuzhan2(zifu,&ch); chuzhan1(shuzi,&a); chuzhan1(shuzi,&b); c=jisuanjieguo(a,ch,b); jinzhan1(shuzi,c); suanfubijiao(zcsuanfu,zifu->suanfu[zifu->top2],shuzi,zifu); } if(i==2) { chuzhan2(zifu,&ch); } if(i==1) { jinzhan2(zifu,zcsuanfu); } } int jisuanjieguo(int a,char ch,int b) { int c; switch(ch) { case'+':c=a+b;break; case'-':c=a-b;break; case'*':c=a*b;break; case'/':c=a/b;break; default:break; } return c; } void shuru(SqStack1 *shuzi,SqStack2 *zifu) { char d[100]; int i,sum=0; printf("请输入算术表达式,=表示结束"); scanf("%s",d); for(i=0;d[i]!='\0';i++) { if((d[i]>='0')&&(d[i]<='9')) {sum=d[i]-'0'; jinzhan1(shuzi,sum); } else { zcsuanfu=d[i]; suanfubijiao(zcsuanfu,zifu->suanfu[zifu->top2],shuzi,zifu); } } } void main() { SqStack1 *s=&shuzi; SqStack2 *z=&zifu; chushihua1(s); chushihua2(z); shuru(s,z); printf("%d",s->data[s->top1]); } 用断点在进栈操作的时候就有问题。。。
C++利用堆栈实现算术表达式的求值,能够处理单目运算符,VS2017,程序异常就终止了,求教
# **stack.h** ``` #ifndef STACK #define STACK #include "stdafx.h" #include <cstdlib> typedef struct stack { double data; struct stack *next; }stack; stack *init_stack() { stack *top; top = (stack*)malloc(sizeof(stack)); top->next = NULL; return top; } int isEmpty(stack *top) { if (top->next = NULL) return 1; else return 0; } float push(stack *top, float x) { stack *p; p = (stack*)malloc(sizeof(stack)); if (p == NULL) return -1; p->data = x; p->next = top->next; top->next = p; return 0; } float pop(stack *top, float *x) { stack *p; if (top->next == NULL) return -1; p = top->next; *x = p->data; top->next = p->next; free(p); return 0; } float getTop(stack *top) { float *x = NULL; if (top->next == NULL) return -1; *x = top->next->data; return *x; } #endif // !STACK ``` ****## 算术表达式求值.cpp**** #include "stdafx.h" #include <stdlib.h> #include <ctype.h> #include "stack2.h" #include <iostream> using namespace std; class Calculator { private: stack *opnd; stack *optr; public: Calculator(); virtual ~Calculator(); int getnext(int *n); int getIndex(char a); char operPrior(char a, char b); float operation(float a, float operate, float b); float evaluateEpression(); }; Calculator::Calculator() { opnd = init_stack(); optr = init_stack(); } Calculator::~Calculator() { ; } int Calculator::getnext(int *n) { char c; *n = 0; while ((c = getchar()) == ' '); if ((!isdigit(c)) && (c != '+' || c != '-' || c != '*' || c != '/' || c != '(' || c != ')' || c != '=')) { throw ("表达式出错!"); } else { push(optr, c); *n = c; return 1; } do { *n = *n * 10 + (c - '0'); c = getchar(); } while(isdigit(c)); cin.putback(c); return 0; } int Calculator::getIndex(char a) { int i; switch (a) { case '+': i = 0; break; case '-': i = 1; break; case '*': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '=': i = 6; break; default: break; } return i; } char Calculator::operPrior(char a, char b) { int i = getIndex(a); int j = getIndex(b); char pre[7][7] = { { '>','>','<','<','<','>','>' }, { '>','>','<','<','<','>','>' }, { '>','>','>','>','<','>','>' }, { '>','>','>','>','<','>','>' }, { '<','<','<','<','<','=','0' }, { '>','>','>','>','0','>','>' }, { '<','<','<','<','<','0','=' } }; return pre[i][j]; } float Calculator::operation(float a, float operate, float b) { float result = 0.0; switch ((int)operate) { case '+': result = a + b; break; case '-': result = a - b; break; case'*': result = a * b; break; case '/': result = a / b; break; default: break; } return result; } float Calculator::evaluateEpression() { int flag = 0; char priorChar; int ch; float *x = NULL; char prior; float left, right; float operate; float *top; push(optr, '='); priorChar = '='; flag = getnext(&ch); while (getTop(optr) != '=' || ch != '=') { if (!flag) { push(opnd, ch); priorChar = '0'; flag = getnext(&ch); } else { priorChar = ch; if ((priorChar == '=' || priorChar == '(') && (ch == '+' || ch == '-')) { push(opnd, 0); priorChar = '0'; } prior = operPrior(getTop(optr), ch); switch (prior) { case '<': push(optr, ch); flag = getnext(&ch); break; case '>': if (isEmpty(opnd)) throw ("表达式出错!"); pop(opnd, &right); if (isEmpty(opnd)) throw ("表达式出错!"); pop(opnd, &left); pop(optr, &operate); push(opnd, operation(left, operate, right)); flag = getnext(&ch); break; case '=': pop(optr, &operate); flag = getnext(&ch); break; case '0': throw ("表达式出错!"); break; default: break; } } } pop(opnd, x); return *x; } int main() { Calculator calcuExpression; float result = 0.0; result = calcuExpression.evaluateEpression(); cout << result << endl; return 0; }
VC6.0 小学生四则运算
程序调试没有错误,就是运行不了 #include<iostream> #include<cstdlib> #include<string> #include <fstream> #include <conio.h> #include<iomanip> #include<ctime> using namespace std; #define MaxSize 100 struct stud { string usename;//文件记录的用户名 string code;//文件记录的密码 int sumnum;//总题数 double percent;//正确率 string end; }student[100];//stud student[100]; string rightusename,rightcode; int rightsumnum; double rightpercent; int n2;//文件中记录的学生所在第几个位置 int init1() { cout<<"小学生四则运算考试模拟系统"<<endl; cout<<" | "<<endl; cout<<" | "<<endl; cout<<" 1.登陆 | "<<endl; cout<<" | "<<endl; cout<<"------------+-------------"<<endl; cout<<" | "<<endl; cout<<" 2.注册 | "<<endl; cout<<" | "<<endl; cout<<" | "<<endl; cout<<"请选择(输入数字):"<<endl; return 1; } int calculate() { string usename; string code; ifstream fp2; fp2.open ("data.txt"); fp2.seekg (0, ios::end); int last = fp2.tellg(); // cout<<"个数"<<last; // cout<<"模版"<<sizeof(student)/100; int n=last/(sizeof(student)/100-7); // cout<<"对象个数:"<<n<<"\n"; //查询文件中对象的个数 ifstream fp3("data.txt"); int i=0; int sumnum; double percent; string end; while(i<n) { fp3>>usename>>code>>sumnum>>percent>>end; student[i].usename=usename; student[i].code=code; i++; } return n; } bool checkout()//登陆验证 { string usename; string code; cout<<"please input your usename:"; cin>>usename; int count=calculate(); bool findname=false; for (int i=0;i<count;i++) { if (student[i].usename==usename) { findname=true; rightusename=usename; cout<<"Name OK!\n"; int j=0; char str[10]="\0"; cout<<"please input your password:"; while (1) { str[j]= getch(); if (str[j++]=='\r')break; cout<<"*"; } for(int s = 0;s<j-1;s++) code += str[s]; bool findcode=false; if (student[i].code==code) { cout<<"\nLogin successfully!"<<endl; findcode=true; n2=i; rightcode=code; system("pause"); return true; } if (!findcode) { cout<<"\nPassword is not correct!"<<endl; system("pause"); return false; } } } if (!findname) { cout<<"Usename is not existed!"<<endl; system("pause"); return false; } getch(); } void Register()//注册 { string code,usename; double percent=0; int sumnum=0; cout<<"请输入你所确定用户名:"; cin>>usename; bool findname = true; while(findname){ findname = false; int count = calculate(); for (int i=0;i < count;i++) { if (!student[i].usename.compare(usename) ) {findname=true;} } if (findname) { cout<<"******************************"<<endl; cout<<"* 用户名已存在! *"<<endl; cout<<"* 请重新输入你的用户名! *"<<endl; cout<<"******************************"<<endl; system("pause"); system("cls"); cout<<"你所确定的用户名:"; cin>>usename; } } int i=0; char str[10]="\0"; cout<<"请输入你所确定的密码:"; while (1) { str[i]= getch(); if (str[i++]=='\r')break; cout<<"*"; } for(int s = 0;s<i-1;s++) code += str[s]; // cout<<"\n请分别输入你所确定密码:"<<code<<endl; string end="end"; int number=0; ofstream fp("data.txt",ios::app); fp<<setw(16)<<usename<<"\n"<<setw(16)<<code<<"\n" <<setw(4)<<sumnum<<"\n"<<setw(8)<<percent<<"\n"<<end<<endl; cout<<"\n"<<"\t"<<" 注册成功!"<<endl; cout<<"*************************************"<<endl; printf("请重新登陆,退出请按E,继续请按其他键!"); char E; scanf("%s",&E); if(E=='E')exit(0); } struct { char ch; int pri; } //设定运算符优先级,ch运算符,pri优先级 lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3}, {'-',3},{')',6}}, rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2}, {'-',2},{')',1}}; int leftpri(char op) //求左运算符op的优先级 { int i; for (i=0;i<7;i++) if (lpri[i].ch==op) return lpri[i].pri; } int rightpri(char op) //求右运算符op的优先级 { int i; for (i=0;i<7;i++) if (rpri[i].ch==op) return rpri[i].pri; } bool InOp(char ch) //判断ch是否为运算符 { if (ch=='(' || ch==')' || ch=='+' || ch=='-' || ch=='*' || ch=='/') return true; else return false; } int Precede(char op1,char op2) //op1和op2运算符优先级的比较结果 { if (leftpri(op1)==rightpri(op2)) return 0; else if (leftpri(op1)<rightpri(op2)) return -1; else return 1; } void trans(char *exp,char postexp[]) //将算术表达式exp转换成后缀表达式postexp { struct { char data[MaxSize]; //存放运算符 int top; //栈指针 } op; //定义运算符栈 int i=0; //i作为postexp的下标 op.top=-1; op.top++; //将'='进栈 op.data[op.top]='='; while (*exp!='\0') //exp表达式未扫描完时循环 { if (!InOp(*exp)) //为数字字符的情况 { while (*exp>='0' && *exp<='9') //判定为数字 { postexp[i++]=*exp; exp++; } postexp[i++]='#'; //用#标识一个数值串结束 } else //为运算符的情况 switch(Precede(op.data[op.top],*exp)) { case -1: //栈顶运算符的优先级低:进栈 op.top++;op.data[op.top]=*exp; exp++; //继续扫描其他字符 break; case 0: //只有括号满足这种情况 op.top--; //将(退栈 exp++; //继续扫描其他字符 break; case 1: //退栈并输出到postexp中 postexp[i++]=op.data[op.top]; op.top--; break; } } //while (*exp!='\0') while (op.data[op.top]!='=') //此时exp扫描完毕,退栈到'='为止 { postexp[i++]=op.data[op.top]; op.top--; } postexp[i]='\0'; //给postexp表达式添加结束标识 } float compvalue(char exp[]) //计算后缀表达式的值 { struct { float data[MaxSize]; //存放数值 int top; //栈指针 } st; //定义数值栈 float d; char ch; int t=0; //t作为exp的下标 st.top=-1; ch=exp[t];t++; while (ch!='\0') //exp字符串未扫描完时循环 { switch (ch) { case'+':st.data[st.top-1]= st.data[st.top-1]+st.data[st.top]; st.top--;break; case '-':st.data[st.top-1]= st.data[st.top-1]-st.data[st.top]; st.top--;break; case '*':st.data[st.top-1]= st.data[st.top-1]*st.data[st.top]; st.top--;break; case '/': if (st.data[st.top]!=0) st.data[st.top-1]= st.data[st.top-1]/st.data[st.top]; else { cout<<"\n"<<"\t"<<"除零错误!"<<endl; exit(0); //异常退出 } st.top--;break; default: d=0; //将数字字符转换成数值存放到d中 while (ch>='0' && ch<='9') //为数字字符 { d=10*d+ch-'0'; ch=exp[t];t++; } st.top++; st.data[st.top]=d; } ch=exp[t];t++; } return st.data[st.top]; } void test() { char algtype[10] ;//计算类型 int i,j,t,//for的循环控制变量 points = 0;//成绩 string usename,code,end; srand((unsigned )time(NULL)); int n=rand()%6+5,//题目的个数,为5到10个 num[MaxSize][MaxSize];//操作数 char op[]={'+','-','*','/'}; cout<<"---------------------------------小学生算法运算测评-----------------------------"; cout<<"现在开始计算:"<<endl<<endl; for(i=0;i<n;++i) { cout<<"第"<<i+1<<"道题:"<<endl; srand((unsigned )time(NULL)); int m=rand()%4+2;//每道题中数字的个数,为2到5个 for(j=0;j<m;++j) { num[i][j] = rand() % 9+1; //产生的随机整数 algtype[j] = rand() % 4; } char string[MaxSize];//把符号数组和数字数组组合在一个字符串里 for(t=0,j=0;t<2*m-2;++t) { string[t]=num[i][j]+'0'; t++; string[t]=op[algtype[j]]; j++; } string[2*m-2]=num[i][m-1]+'0'; string[2*m-1]='\0'; //插入括号 int t=rand() % 5, r=rand() % 5,//r,t都是小于m的随机数 min,max,a;//a为字符串的长度 while(t==r||t>=m||r>= m) { r=rand()%5; t=rand() % 5; } min=t>r?r:t;//min为r,t较小的数 max=t>r?t:r;//max为t,r较大的数 if(min==0&&max==m-1); else { for(a=2*m-1;a>2*min;a--) string[a]=string[a-1]; string[2*min]='('; for(a=2*m;a>2*max+2;a--) string[a]=string[a-1]; string[2*max+2]=')'; string[2*m+1]='\0'; } //输出字符串 int d=0; while(string[d]!='\0') cout<<string[d++]; cout<<"= ?"<<"\n"<<"\t"<<"请输入答案:"; char answer[4]; //学生回答 cin>>answer; char postexp[MaxSize]; trans(string,postexp);//求得正确的答案 int value= compvalue(postexp);//value放的是正确的结果程序的计算结果 int i1= 0; int totle=0; bool fuhao = false; if(answer[0] == '-') {fuhao = true;i1++;} for(;answer[i1]!='\0';i1++) { totle=totle*10+answer[i1]-'0'; } if(fuhao) {totle = -totle;} if(totle == value) { cout<<"\t"<<"恭喜你,答案是对的!"<<endl; points++; } else { cout<<"\t"<<"抱歉,你做错了!"; cout<<"\t"<<"正确的答案是:"<<value<<endl; } int sumnum; double percent; char yesORno ; //回答是否继续 if(i<n-1) { cout<<"\t"<<"是否继续?y/n"<<"\t"; cin>>yesORno; if(yesORno =='y') cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; else { cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; cout<<"你已终止答题!"<<endl; cout<<"你所答的题目总数为:"<<i+1<<"\t"; cout<<"你目前答对的题目数:"<<points<<"\t"; cout<<"\n"<<"你答题的正确率是:"<<setprecision(3)<<float(points)/float(i+1)*100<<"%"<<endl; rightsumnum=i+1; rightpercent=float(points)/float(i+1)*100; i = n; } } if(i==n-1) { cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; cout<<"你已完成所有的题目!"<<endl; cout<<"你所答的题目总数为:"<<i+1<<"\t"; cout<<"你目前答对的题目数:"<<points<<"\t"; cout<<"你答题的正确率是:"<<setprecision(3)<<float(points)/float(i+1)*100<<"%"<<endl; rightsumnum=i+1; rightpercent=float(points)/float(i+1)*100; } int location=n2*(sizeof(student)/100-7); fstream inoutfile("data.txt"); inoutfile.seekp(location); inoutfile<<setw(16)<<rightusename<<"\n"<<setw(16)<<rightcode<<"\n" <<setw(4)<<rightsumnum<<"\n"<<setw(8)<<rightpercent<<"\n"<<"end"<<endl; inoutfile.close (); } } int seegrade() { string end; system("cls"); int location=n2*(sizeof(student)/100-7); ifstream infile("data.txt"); infile.seekg(location); infile>>rightusename>>rightcode>>rightsumnum>>rightpercent>>end; int yes=rightpercent/100*rightsumnum; cout<<" \1\1\1\1 尊敬的"<<rightusename<<" \1\1\1\1"<<endl; cout<<"****************************************************"<<endl; cout<<"*您的上一次答题情况 *"<<endl; cout<<"*你所答题的个数为:"<<rightsumnum<<" *"<<endl; cout<<"*你答对的题目数为:"<<yes<<" *"<<endl; cout<<"*你答题的正确率为:"<<rightpercent<<"%"<<" *"<<endl; cout<<"****************************************************"<<endl; infile.close (); return 1; } int init2() { system("cls"); cout<<"小学生四则运算考试模拟系统"<<endl; cout<<" | "<<endl; cout<<" | "<<endl; cout<<" 1.开始答题| "<<endl; cout<<" | "<<endl; cout<<"------------+-------------"<<endl; cout<<" | "<<endl; cout<<" 2.查看分数| "<<endl; cout<<" | "<<endl; cout<<"------------+-------------"<<endl; cout<<" | "<<endl; cout<<" 3.退出 | "<<endl; cout<<" | "<<endl; cout<<" | "<<endl; cout<<"请选择(输入数字):"<<endl; return 1; } int main() { while(1) { int i; init1(); i = getch(); if(i=='1') system("cls"); else if(i='2'){system("cls");Register();system("cls");cout<<"请重新登录!"<<endl; } if(checkout()) { while(1) { init2(); int i = getch(); fflush(stdin);//清除缓冲区 if(i == '1') { system("cls"); test(); system("pause"); } else if(i == '2') {seegrade();system("pause");} else if(i == '3') break; } system("cls"); cout<<"感谢您的使用!"<<endl; system("pause"); } system("cls"); } return(0); } 请各位大神帮一下忙,不胜感激!
C语言 为何总是提示“栈下溢”?
本人新手一个,最近才开始上软件课,这是最近的一个简单计算器作业,然而输入式子后却总是显示“栈下溢”,有点怀疑是pop的原因,请各位大神教我,谢谢!! ![图片说明](https://img-ask.csdn.net/upload/201605/12/1463067861_663101.png) ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <conio.h> #include <ctype.h> #define maxsize 50 typedef char datatype; typedef struct { int data[maxsize]; int Top; } SeqStack; void InitStack(SeqStack*&S) { S = (SeqStack*)malloc(sizeof(SeqStack)); S->Top = 0; } int push(SeqStack*s,datatype e) //入栈函数 { if (s->Top>=maxsize - 1) { printf("栈上溢"); return 0; } else { s->data[++s->Top] = e; return 1; } } char pop(SeqStack*s,datatype&e) //出栈函数 { if (s->Top<=0) { printf("栈下溢"); return 0; } else { return e = s->data[s->Top--]; } } char GetTop(SeqStack*s,datatype&e) //取栈顶元素函数 { if (s->Top<=0) { printf("栈下溢"); return 0; } else { e = s->data[s->Top]; return 1; } } char precede(char top,char read) //比较栈顶元素和读取元素的优先级函数 { switch(read) { case '#': return '>'; case '+': case '-': if (top == '#') { return '<'; } else return '>'; case '*': case '/': if (top == '+'||top == '-'||top == '#') { return '<'; } else return '>'; } } char operate(char n1,char op,char n2) //运算函数 { int sum;char s; switch (op) { case '+': sum = (n1 - 48) + (n2 - 48); case '-': sum = (n1 - 48) - (n2 - 48); case '*': sum = (n1 - 48) * (n2 - 48); case '/': sum = (n1 - 48) / (n2 - 48); } s = (char)sum; return s; } int EvaluateExpression() { SeqStack *OPTR; SeqStack *OPND; InitStack(OPTR); InitStack(OPND); char ch;char top;char poper; push (OPTR,'#'); while (((ch = getchar()) != '#')||GetTop(OPTR,top) != '#') { if (ch != '+'&&ch != '-'&&ch != '*'&&ch != '/'&&ch != '('&&ch !=')') { push (OPND,ch); } else { switch (precede(GetTop(OPTR,top),ch)) //判断优先级 { case '<': push (OPTR,ch); break; case '>': char op = pop (OPTR,poper); char b = pop (OPND,poper); char a = pop (OPND,poper); push (OPND,operate(a,op,b)); break; } } } int result = (int)GetTop(OPND,top); return result; } int main() { int result; printf("输入你的算术表达式,以#结束:\n"); result=EvaluateExpression(); printf("结果是 :%d\n",result); return 0; } ```
一个java的题目问题,请大家帮忙指导一下,谢谢!
题目如下:1.定义类People 属性:姓名,年龄, 方法: 设置姓名:通过参数设置姓名 获取姓名:返回姓名 设置年龄:通过参数设置年龄 获取年龄:返回年龄 定义People的子类Student 私有成员:学校 方法: 设置学校:通过参数设置学校 获取学校:返回学校 进行两个数的算术运算:输入两个数,再输入操作符+或-或*或/,根据操作符返回两个数的运算结果。(如果操作符不是这四个中的一个要求用户重新输入直到输入正确为止) 在类Test中定义main方法,创建Student类的对象,设置年龄,设置姓名,计算两个数的算术运算。 我的代码是:package work3; import java.util.*; public class People { String name; int age; static Scanner input=new Scanner(System.in); People(String name,int age){ this.name=name; this.age=age; } void getName(){ System.out.print("Your name:"); String name=input.nextLine(); } void getAge(){ System.out.print("Your age:"); int age=input.nextInt(); } void run(){ System.out.println("Please input you to compute the two numbers:"); int one=input.nextInt(); int two=input.nextInt(); System.out.println("Which operation way you want '+' '-' '*' '/'"); char c=(input.next().charAt(0)); if(c!='+'&&c!='-'&&c!='*'&&c!='/'){} else{ switch(c){ case'+':System.out.print(one+two); case'-':System.out.print(one-two); case'*':System.out.print(one*two); case'/':System.out.print(one/two); } } } } package work3; public class Student extends People{ private static String school; Student(String name, int age,String school) { super(name, age); this.school=school; // TODO Auto-generated constructor stub } void setSchool(){ System.out.println("Your school:"); String school=input.nextLine(); } static String getSchool(){ return school; } void search(){ System.out.println("Your name:"+name+"Your age:"+age+"Your school:"+school); } public static void main(String[] args){ Student a=new Student("",10,""); a.getName(); a.getAge(); a.getSchool(); a.search(); a.run(); } } 我的问题主要是在第二个class中,我只会一开始就建立好一个student a并且是在代码中给他属性进行的赋值,而我不懂得如何进行编码才能使得student a的属性是通过在控制台输入来进行student a的创建,和属性的赋值,还请大家帮帮忙,谢谢(小白一枚,大家多多指教)
数据结构-表达式求值,为什么只能求类似于3*(5-2)的一位数表达式?求大神指点
#include<iostream> #include<cmath> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 using namespace std; typedef struct { int *base; int *top; int stacksize; }SqStack; int InitStack(SqStack &S) { S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int ClearStack(SqStack &S) { S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int GetTop(SqStack S,int &e) { if(S.base==S.top) return ERROR; e=*(S.top-1); return OK; } int Push(SqStack &S,int e) { if((S.top-S.base)>=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top=e; S.top++; return OK; } int Pop(SqStack &S,int &e) { if(S.top==S.base) return ERROR; S.top--; e=*S.top; return OK; } int Pop2(SqStack &S,char &e) { if(S.top==S.base) return ERROR; S.top--; e=*S.top; return OK; } bool StackEmpty(SqStack S) { if(S.top==S.base) return true; else return false; } int StackLength(SqStack S) { int len=0; if(S.top==S.base) return 0; else while(S.top!=S.base) { S.top--; len++; } return len; } //数制转换:输入任意一个非负十进制整数,打印输出与其等值的进制数 void conversion(SqStack S) { int N,id,n; cout<<"请输入任意一个非负十进制整数:"; cin>>N; cout<<"请输入需要转换的进制 :"; cin>>id; n=N; while(N) { Push(S,N%id); N=N/id; } cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"十进制数"<<n<<"对应的"<<id<<"进制数为"; while(S.top!=S.base) { S.top--; cout<<*S.top; } cout<<endl; cout<<"此时栈的长度为"<<StackLength(S)<<endl; } //括号匹配的检验 int match(SqStack S) { char a[100],b[100]; cout<<"请输入一串由圆括号和方括号组成的表达式:"; cin>>a; for(int i=0;i<strlen(a);i++) { cout<<"i="<<i<<endl; if((a[i]!='[') && (a[i]!=']') && (a[i]!='(') && (a[i]!=')')) { cout<<"输入字符不正确!!!"; return 0; } else { if((a[i]=='[')||(a[i]=='(')) { Push(S,a[i]); cout<<"此时栈的长度为"<<StackLength(S)<<endl; } else if(a[i]==']') { if(S.top==S.base) { cout<<"括号不匹配!"; return 0; } else { S.top--; if(*S.top=='[') { b[i]=*S.top; cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"b["<<i<<"]="<<b[i]<<endl; } else { cout<<"括号不匹配!"; return 0; } } } else { if(a[i]==')') { if(S.top==S.base) { cout<<"括号不匹配!"; return 0; } else { S.top--; if(*S.top=='(') { b[i]=*S.top; cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"b["<<i<<"]="<<b[i]<<endl; } else { cout<<"括号不匹配!"; return 0; } } } } } } cout<<"匹配成功!"<<endl; return 1; } //行编辑程序 void LineEdit(SqStack S) { char a[100],b[100]; int *base=S.base; cout<<"请输入数据:"; cin>>a; for(int i=0;i<strlen(a);i++) { while(a[i]!=EOF && a[i]!='\n') { if(a[i]=='#') //'#'表示前一个字符无效 { Pop2(S,b[i-1]); cout<<"b["<<i-1<<"]="<<b[i-1]<<endl; break; } else if(a[i]=='@') //'@'表示当前行中的字符均无效 { ClearStack(S); break; } else { Push(S,a[i]); break; } } } while(base!=S.top) { cout<<char(*base); base++; } cout<<endl; } int Precede(char a,char b) //1代表'>';0代表'=';-1代表'<' { int st; if(a=='+') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='-') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='*') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='/') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='(') { switch(b) { case '+': st=-1; break; case '-': st=-1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=0; break; case '#': break; } } else if(a==')') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='#') { switch(b) { case '+': st=-1; break; case '-': st=-1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': break; case '#': st=0; break; } } return st; } int Operate(int a,char theta,int b) { int result; switch(theta) { case'+': result=a+b; break; case'-': result=a-b; break; case'*': result=a*b; break; case'/': result=a/b; break; } return result; } int EvaluteExpression() { SqStack OPTR,OPND; char x,theta; char arr[100],dr[]={'#'}; int j=0,e,n,a,b,result; int y; int *optrT,*optrB,*opndT,*opndB; InitStack(OPTR); Push(OPTR,'#'); //以int值进栈,出栈需转换 InitStack(OPND); //cout<<"请输入算术表达式:"; //算术表达式以'#'结束 //cin>>arr; cout<<"请输入:"; cin>>y for(int i=0;i<strlen(arr);i++) { GetTop(OPTR,e); cout<<"****************************"<<endl; cout<<"i="<<i<<endl; cout<<"输入字符"<<arr[i]<<endl; cout<<"char(e)="<<char(e)<<endl; if(arr[i]!='#' || char(e)!='#') { if(arr[i]!='+' && arr[i]!='-' && arr[i]!='*' && arr[i]!='/' && arr[i]!='(' && arr[i]!=')' && arr[i]!='#') //操作数 { Push(OPND,arr[i]-'0'); opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素:"; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; } else { GetTop(OPTR,e); cout<<"e="<<char(e)<<endl; n=Precede(char(e),arr[i]); cout<<"n="<<n<<endl; switch(n) { case -1: Push(OPTR,arr[i]); optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素:"; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; case 0: Pop2(OPTR,x); opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素:"; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素:"; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; case 1: Pop2(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); i--; opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素:"; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素:"; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; } } } } GetTop(OPND,result); cout<<arr<<"="<<result<<endl; return OK; } int main() { /*SqStack S; InitStack(S); conversion(S); match(S); LineEdit(S);*/ EvaluteExpression(); return OK; }
请各位老手帮我看看我的代码有什么问题,为什么编译通过了但是运行有错误。
做的数据结构课程设计,中缀算术表达式求值但是课程还没有学,参考书上代码编的。 代码如下: #include<malloc.h> #include<stdio.h> #include<ctype.h> #include<stdlib.h> #define MAXSIZE 100 typedef int elemtype; char ch[7] = { '+','-','*','/','(',')','#' }; int f1[7] = { 3,3,5,5,1,6,0 }; int f2[7] = { 2,2,4,4,6,1,0 }; int n = 0; typedef struct sqstack { //顺序栈结构 elemtype stack[MAXSIZE]; int top; }sqstack; //1.把操作符转换成相应的数字 elemtype cton(char c) { switch (c) { case'+': return 0; case'-': return 1; case'*': return 2; case'/': return 3; case'(': return 4; case')': return 5; default: return 6; } } //2.通过原来的设定比较两个字符的优先级 char Compare(char c1, char c2) { int i1 = cton(c1); int i2 = cton(c2); if (f1[i1] > f2[i2]) return '>'; else if (f1[i1] < f2[i2]) return '<'; else return '='; } //3.进行四则运算,并返回结果 int Operate(elemtype a, elemtype t, elemtype b) { int sum; switch (t) { case 0: sum = a + b; break; case 1: sum = a - b; break; case 2: sum = a*b; break; default: sum = a / b; } return sum; } //5.取栈顶元素 elemtype Gettop(sqstack s) { if (s.top == 0) { printf("ERROR,underflow\n"); return 0; } else return s.stack[s.top]; } //6.初始化栈 void Initstack(sqstack *s) { s->top = 0; } //7.出栈 void Pop(sqstack *s, elemtype *x) { if (s->top == 0) printf("ERROR,Underflow\n"); else { *x = s->stack[s->top]; s->top--; } } //8.入栈 void Push(sqstack *s, elemtype x) { if (s->top == MAXSIZE - 1) printf("ERROR,Overflow!\n"); else { s->top++; s->stack[s->top] = x; } } //9.若S为空栈,则返回TURE,否则返回FALSE bool StackEmpty(sqstack S) { if (S.top == 0) return true; else return false; } //4.主要的表达式计算函数,返回表达式计算结果 int EvaluateExpression() { char c; int i = 0, sum = 0; int k = 1, j = 1; elemtype x, a, t, b; sqstack OPTR, OPND; Initstack(&OPTR); Push(&OPTR, cton('#')); Initstack(&OPND); c = getchar(); while (c != '#' || ch[Gettop(OPTR)] != '#') { if (isdigit(c)) { sum = 0; while (isdigit(c)) { if (!j) { sum = sum * 10 - (c - '0'); } else sum = sum * 10 + (c - '0'); c = getchar(); } Push(&OPTR, sum); j = 1; } else if (k) { switch (Compare(ch[Gettop(OPTR)], c)) { case'<':Push(&OPTR, cton(c)); c = getchar(); break; case'=':Pop(&OPTR, &x); c = getchar(); break; case'>':Pop(&OPTR, &t); Pop(&OPND, &b); Pop(&OPND, &a); Push(&OPND, Operate(a, t, b)); break; } } } return(Gettop(OPND)); } //10.主函数 int main() { int result; printf("**********欢迎使用中缀算数表达式求值程序**********\n"); printf("请输入您要计算的表达式(以#号结束)\n"); result = EvaluateExpression(); printf("表达式的计算结果是:%d\n",result); return 0; } ``` ```
C语言小白 编译运行无误。求大神看一下为什么最后运行时输入等号回车后没有结果?
#include<stdio.h> #include<stdlib.h> #include<math.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAXSIZE 100 typedef char DataType; typedef struct { DataType data[MAXSIZE]; int top; }SqStack; int InitStack(SqStack &S) { //构造一个空栈 S.top= -1; return 1; } int StackEmpty(SqStack S) //判栈为空栈时返回值为真,反之为假 { return(S.top==-1? TRUE:FALSE);} int StackFull(SqStack S) //判栈为满栈时返回值为真,反之为假 { return(S.top==MAXSIZE-1?TRUE:FALSE);} int Push(SqStack &S, DataType e) { //将元素e插入到栈中,作为的新栈顶 if(StackFull(S)) return ERROR; //栈满 S.top++; // top加1,栈顶位置上移 S.data[S.top]=e; //数据e存入当前栈顶 return 1; } int Pop(SqStack &S,DataType &e) {//若栈不为空,则删除栈顶元素 if(StackEmpty(S)) return ERROR; //栈空 e=S.data[S.top]; //取出数据放入e所指单元中 S.top--; // top减1,栈顶位置下移 return 1; } DataType GetTop(SqStack S) {//若栈不为空,则取栈顶元素 DataType e; if(StackEmpty(S)) return ERROR; //栈空 e=S.data[S.top]; //取出数据,top不变 return e; } typedef char DataType; int bracketmatching() { SqStack S; DataType ch; InitStack(S); while ((ch=getchar())!='\n') { switch (ch) //遇左括号入栈;遇到右括号时,分别检测匹配情况 { case '(': case '[': case '{': Push(S,ch);break; case ')': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!= '(') return FALSE; } break; case ']': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!= '[') return FALSE; } break; case '}': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!='{') return FALSE; } break; default:break; } } if (StackEmpty(S)) return TRUE; else return FALSE; } int In(char ch) /*判断字符ch是否为算符*/ { int i,flag=0; char op[7]={'+','-','*','/','(',')','='}; /*算符数组*/ for (i=0;i<7;i++) if(ch==op[i]) { flag=1; break; } return flag; } DataType Operate(DataType a,char theta,DataType b) { DataType z; switch (theta) { case '+':z=a+b;break; case '-':z=a-b;break; case '*':z=a*b;break; case '/':z=a/b;break; } return(z); } char Precede (char a,char b) /*比较两个运算符的优先级*/ { char z; if((b=='+')||(b=='-')||(b=='*')||(b=='/')|| (b=='(')||(b==')') ||(b=='=')) switch (a) {case '+': case '-': if((b=='*')||(b=='/')||(b=='(')) z='<'; else z='>'; break; case '*': case '/': if(b=='(') z='<'; else z='>';break; } return z; } float CaculateExpression(char *str) { //算术表达式求值的算符优先算法。设optr和opnd分别为算符栈和操作数栈, //OP为算符集合 char a,b,theta,x,u; SqStack optr,opnd; char *p; int k; InitStack(optr); Push(optr, '='); InitStack(opnd); p=str;//c=getchar(); while(*p!='=' ||GetTop(optr)!='=') { if(!In(*p)) { u=0; k=0;//统计小数位数 while(*p>='0'&&*p<='9'||*p=='.') { if(*p!='.')u=u*10+*p-'0'; if(*p=='.'||k>0) k++; p++; } if(k>0) u=u/pow(10,k-1); Push(opnd,u); } //不是算符则进栈 else switch(Precede(GetTop(optr),*p)) { case '<' : //栈顶算符优先级低 Push(optr,*p); p++;//c=getchar(); break; case '=' : //优先级相同,脱去括号并读入下一字符 Pop(optr,x); p++;//c=getchar(); break; case '>' : //栈顶算符优先级高,退栈并将运算结果入栈 Pop(optr,theta); Pop(opnd,b);Pop(opnd,a); Push(opnd,Operate(a,theta,b)); break; }} return GetTop(opnd); } int JudgeExpression(char *str) { char*p; p=str; while(*p!='\0') p++; p--; if(*p!='=') { printf("表达式要以等号结束!"); return 0; } return 1; } int main() { char str[81]; printf("请输入表达式:"); scanf("%s",str); if(JudgeExpression(str)) printf("%s%f\n",str,CaculateExpression(str)); return 0; }
数据结构课程设计!!求大神帮助
本人数据结构课程设计做的是算术表达式求值,但是程序运行起来一直无限循环。请各位大神求助!万分感谢。明天就要交了。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define OK1 1 #define OK2 1.0 #define TRUE 1 #define ERROR1 0 #define ERROR2 0.0 #define FALSE 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 char OPSET[7]={'+','-','*','/','(',')','#'}; char Prior[7][7] = { // 算符间的优先关系 '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=',' ', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=' }; typedef struct //运算符栈 { char *base; //在栈构造之前和销毁之后,base的值为NULL char *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack1; typedef struct //操作数栈 { float *base; //在栈构造之前和销毁之后,base的值为NULL float *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack2; void InitStack1(SqStack1 &S1){ //构造一个空栈 S1.base = (char *) malloc(STACK_INIT_SIZE * sizeof(char)); if (!S1.base) exit(OVERFLOW); //存储分配失败 S1.top = S1.base; S1.stacksize = STACK_INIT_SIZE; } char GetTop1(SqStack1 S1){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR; char e; if (S1.top == S1.base) return ERROR1; e = *(S1.top - 1); return e; } char Push1(SqStack1 &S1, char e){ //插入元素e为新的栈顶元素 if(S1.top - S1.base >= S1.stacksize) {//栈满,追加存储空间 S1.base = (char *) realloc(S1.base, (S1.stacksize + STACKINCREMENT) * sizeof(char)); if (!S1.base) exit(OVERFLOW);//存储分配失败 S1.top = S1.base + S1.stacksize; S1.stacksize += STACKINCREMENT; } *S1.top++ = e; return OK1; } char Pop1(SqStack1 &S1){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR char e; if (S1.top == S1.base) return ERROR1; e = *--S1.top; return e; } void DispStack1(SqStack1 &S1){//从栈底到栈顶依次输出各元素 char e,*p; if(S1.top==S1.base) printf(" "); else{ p=S1.base; while(p<S1.top){ e=*p; p++; printf("%c",e); } } } void InitStack2(SqStack2 &S2){ //构造一个空栈 S2.base = (float *) malloc(STACK_INIT_SIZE * sizeof(float) ); if (!S2.base) exit(OVERFLOW); //存储分配失败 S2.top = S2.base; S2.stacksize = STACK_INIT_SIZE; } float GetTop2(SqStack2 S2){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR; float e; if (S2.top == S2.base) return ERROR2; e = *(S2.top - 1); return e; } float Push2(SqStack2 &S2, float e){ //插入元素e为新的栈顶元素 if (S2.top - S2.base >= S2.stacksize) { //栈满,追加存储空间 S2.base = (float *) realloc(S2.base, (S2.stacksize + STACKINCREMENT) * sizeof(float) ); if (!S2.base) exit(OVERFLOW);//存储分配失败 S2.top = S2.base + S2.stacksize; S2.stacksize += STACKINCREMENT; } *S2.top++ = e; return OK2; } float Pop2(SqStack2 &S2){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR float e; if (S2.top == S2.base) return ERROR2; e = *--S2.top; return e; } void DispStack2(SqStack2 &S2){ //从栈底到栈顶依次输出各元素 float e,*p; if(S2.top==S2.base) printf(" "); else{ p=S2.base; while(p<S2.top){ e=*p; p++; printf("%f",e); } } } char Precede(char OP1,char OP2){ //判断运算符优先级 int i=0,j=0; while(OPSET[i]!=OP1){ i++; } while(OPSET[j]!=OP2){ j++; } return Prior[i][j]; } float Operate(float a, char theta, float b) { //运算 float s; switch(theta){ case '+': s= a+b;break; case '-': s= a-b;break; case '*': s= a*b;break; case '/': if(b!=0) s= a/b;break; default : s= 0.0; } return s; } float EvaluateExpression(){ char c; float t,e; int n=0,i=1,j=0,k=0,l=0; char ch[STACK_INIT_SIZE]; int s=1,flag=0,flag2=0; float p1,p2; char ch1; SqStack1 S1; InitStack1(S1); SqStack2 S2; InitStack2(S2); Push1(S1,'#'); printf("请输入不含变量的表达式(以'#'结尾):\n"); c=getchar(); ch[0]=c; printf("\n对表达式求值操作过程如下:"); printf("\n____________________________________________________________\n"); printf("步骤\t运算符栈S1\t操作数栈S2\t输入字符\t\t主要操作"); while(c!='#'||GetTop1(S1)!='#'){ printf("\n____________________________________________________________\n"); printf("%d\t",i++); DispStack1(S1); printf("\t\t"); DispStack2(S2); printf("\t\t"); if(flag==1){ k--; flag=0; } if(flag2){ k=k+flag2; flag2=0; } for(l=0;l<k;l++) printf(" "); for(j=k;ch[j]!='\0';j++) printf("%c",ch[j]); if(ch[k]!='#'&&flag!=1){ k++; flag=0; } as: if(!(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')){ //输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数 if(!(c=='.')&&n>=0){ e=(float)c-48; n++; if(n==1) t=e; else if(n>1) t=t*10+e; c=ch[s++]; } if(n==-1){ e=(float)c-48; t=t+e/10; c=ch[s++]; } if(c=='.'){ n=-1; c=ch[s++]; } if((c>='0'&&c<='9')||c=='.'){ flag2++; goto as; } if(c<'0'||c>'9'){ Push2(S2,t); } printf("\t\tPush2(S2,%f)",t); } else{//输入的是运算符 n=0;//非运算型数据计数器清零 switch(Precede(GetTop1(S1),c)){//比较运算符的优先级 case '<': //栈顶元素优先级低,则入栈且继续输入 Push1(S1,c); printf("\t\tPush1(S1,%c)",c); c=ch[s++]; break; case '=': //栈顶元素优先级相等,脱括号并接收下一字符 Pop1(S1); printf("\t\tPop1(S1)"); c=ch[s++]; break; case '>': //栈顶元素优先级高,则退栈并将运算结果入栈 p1=Pop2(S2); p2=Pop2(S2); ch1=Pop1(S1); Push2(S2,Operate(p2,ch1,p1)); printf("\t\tOperate(%f,%c,%f)",p2,ch1,p1); flag=1; break; } } } printf("\n____________________________________________________________\n"); printf("%d\t#\t\t%f\t\t",i,GetTop2(S2)); for(j=0;j<k;j++) printf(" "); printf("#\t\tRETURN(GETTOP(S2))"); printf("\n____________________________________________________________\n"); if(S2.top-1==S2.base)//显示表达式最终结果 printf("表达式的结果为:%f",GetTop2(S2)); else printf("\n表达式出错!\n"); } void main(){ EvaluateExpression(); }
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
C++(数据结构与算法):62---搜索树(二叉搜索树、索引二叉搜索树)
一、搜索树的复杂度分析 本文考察二叉搜索树和索引二叉搜索树 二叉搜索树的渐进性能可以和跳表媲美: 查找、插入、删除操作所需的平均时间为Θ(logn) 查找、插入、删除操作的最坏情况的时间为Θ(n) 元素按升序输出时所需时间为Θ(n) 虽然在最坏情况下的查找、插入、删除操作,散列表和二叉搜索树的时间性能相同,但是散列表在最好的情况下具有超级性能Θ(1) 不过,对于一个指定的关键...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
leetcode88. 合并两个有序数组
给定两个有序整数数组nums1 和 nums2,将 nums2 合并到nums1中,使得num1 成为一个有序数组。 说明: 初始化nums1 和 nums2 的元素数量分别为m 和 n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = ...
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
立即提问