功能:
大致思路:
整体思路:
1.建栈:创建一个空链栈,把数字类型放入栈中。
2.入栈:需要一个栈头和准备入栈的数字。push(T *,int);
3.计算:从输入中读取数据,当遇到不是数字类型时,就从栈顶上往下取数据,取top->data和(top->next)->data;进行计算;
4.出栈:计算完成之后把刚才计算的那两个节点出栈,把得到的计算的结果从新放入栈中,并释放内存;
5.其他:使用字符串输入需要注意:当多个数字一起时不能判断大于10位以上的,所以需要做相关记号,或者采用循环单个输入法以某个特定符号结束。
代码实现:
- 节点设计:
typedef struct OperandType{
int data; //操作数
struct OperandType * next;
}*LinkedList;
- 构建空栈:
LinkedList createStack(){
LinkedList top = (LinkedList) malloc (sizeof(OperandType)); //申请内存
if(top != NULL){
top->next = NULL;
return top;
}
}
- 入栈实现:
int push(LinkedList top,int num){
LinkedList node = (LinkedList) malloc (sizeof(OperandType)); //申请内存
//如果申请失败,那就再见
if(node == NULL){
return 0;
}else{
node->data = num;
node->next = top->next;
top->next = node;
return 1;
}
}
- 计算步骤:这个
int calculate(LinkedList top,char oper){
//4.1栈里面去栈顶和栈顶下一个进行计算
int val1,val2,result;
if(top == NULL){
cout<<"空栈"<<endl;
return -1;
}else{
//计算完成删除栈顶两个元素
val1 = pop(top);
val2 = pop(top);
//判断运行符
switch(oper){
case '+':result = val2 + val1;break;
case '-':result = val2 - val1;break;
case '*':result = val2 * val1;break;
case '/':result = val2 / val1;break;
}
cout<<val2<<oper<<val1<<" = "<<result<<endl;
//把结果放入栈
push(top,result);
return result;
}
}
- 出栈实现:
//5.删除
int pop(LinkedList top){
LinkedList node;
int value = 0;
if(top->next == NULL){
return 0;
}else{
node = top->next;
top->next = node->next;
value = node->data;
free(node);
return value;
}
}
- 其他:
#include<sstream> //这个是用来char 转 int 的
stringstream ss ;
string num = “404”;
ss << num;
ss >> number; //number type int2.强转问题:
char c = ‘5’;
int a = (int)c; //此时的a转为5的ascii码,可以a = a - 48;得到5
- 运行结果:
8. 备注:
转载请说明出处!
9.源码:
在这里https://blog.csdn.net/weixin_43386443/article/details/101636534