c 结构体方式实现后缀表达式计算(数据结构)

功能:

在这里插入图片描述

大致思路:

整体思路:
1.建栈:创建一个空链栈,把数字类型放入栈中。
2.入栈:需要一个栈头和准备入栈的数字。push(T *,int);
3.计算:从输入中读取数据,当遇到不是数字类型时,就从栈顶上往下取数据,取top->data和(top->next)->data;进行计算;
4.出栈:计算完成之后把刚才计算的那两个节点出栈,把得到的计算的结果从新放入栈中,并释放内存;
5.其他:使用字符串输入需要注意:当多个数字一起时不能判断大于10位以上的,所以需要做相关记号,或者采用循环单个输入法以某个特定符号结束。

代码实现:
  1. 节点设计:
typedef struct OperandType{
	int data;			//操作数 
	struct OperandType * next;	
}*LinkedList;
  1. 构建空栈:
LinkedList createStack(){
	LinkedList top = (LinkedList) malloc (sizeof(OperandType));	//申请内存 
	if(top != NULL){
		top->next = NULL;
		return top;
	}
}
  1. 入栈实现:
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;
	}
}
  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;
	}
} 
  1. 出栈实现:
//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;
	}
}
  1. 其他:

#include<sstream> //这个是用来char 转 int 的
stringstream ss ;
string num = “404”;
ss << num;
ss >> number; //number type int

2.强转问题:
char c = ‘5’;
int a = (int)c; //此时的a转为5的ascii码,可以a = a - 48;得到5

  1. 运行结果:

在这里插入图片描述
8. 备注:

转载请说明出处!

9.源码:
在这里https://blog.csdn.net/weixin_43386443/article/details/101636534

发布了21 篇原创文章 · 获赞 2 · 访问量 6490

猜你喜欢

转载自blog.csdn.net/weixin_43386443/article/details/101615016