CodeUp 堆栈队列 简单计算器

题目地址

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<map> 
using namespace std;
struct node
{
	double num;
	char op;
	bool flag; 
};
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();)
	{
		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++;
			}
			q.push(temp);
		}	
		else
		{
			temp.flag  = false;// 操作符
			while(!s.empty() && op[str[i]] <= op[s.top().op])
			{
				q.push(s.top());
				s.pop();
			} 
			temp.op = str[i];
			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;
			s.push(temp); 
		 } 
		
	}
	return s.top().num;
} 

int main()
{
	///设定操作符优先级 
	op['+'] = op['-'] = 1;
	op['*'] = op['/'] = 2;
	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());
	}
	
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个经典的问题,我来给你讲讲如何用堆栈队列实现计算器仿真。 首先,我们需要定义一个结构体来表示计算器的操作数和操作符,可以定义如下: ```c typedef struct { int type; // 0表示操作数,1表示操作符 int value; // 操作数的值 char operator; // 操作符 } Element; ``` 然后,我们可以定义两个数组来分别表示堆栈队列,如下: ```c Element stack[100]; int top = -1; Element queue[100]; int front = 0, rear = 0; ``` 接下来,我们需要实现入栈、出栈、入队、出队等基本操作。具体代码如下: ```c // 入栈 void push(Element e) { top++; stack[top] = e; } // 出栈 Element pop() { if (top == -1) { printf("Stack is empty!\n"); exit(0); } Element e = stack[top]; top--; return e; } // 入队 void enqueue(Element e) { queue[rear] = e; rear++; } // 出队 Element dequeue() { if (front == rear) { printf("Queue is empty!\n"); exit(0); } Element e = queue[front]; front++; return e; } ``` 接下来,我们可以实现一个函数来读取用户输入的表达式并将其转换成操作数和操作符的序列。具体代码如下: ```c void readExpression() { char input[100]; printf("Please enter an expression:\n"); scanf("%s", input); int i = 0; while (input[i] != '\0') { if (isdigit(input[i])) { // 如果是数字,将其转换成操作数 int value = input[i] - '0'; i++; while (isdigit(input[i])) { value = value * 10 + input[i] - '0'; i++; } Element e; e.type = 0; // 0表示操作数 e.value = value; enqueue(e); } else if (input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/') { // 如果是操作符,直接入队 Element e; e.type = 1; // 1表示操作符 e.operator = input[i]; enqueue(e); i++; } else { // 如果是其它字符,忽略 i++; } } } ``` 最后,我们可以实现一个函数来计算表达式的值,具体代码如下: ```c int calculate() { while (front < rear) { Element e = dequeue(); if (e.type == 0) { // 如果是操作数,入栈 push(e); } else { // 如果是操作符,从栈中取出两个操作数进行计算,将结果入栈 Element e1 = pop(); Element e2 = pop(); int value; switch (e.operator) { case '+': value = e2.value + e1.value; break; case '-': value = e2.value - e1.value; break; case '*': value = e2.value * e1.value; break; case '/': value = e2.value / e1.value; break; default: printf("Invalid operator!\n"); exit(0); } Element e3; e3.type = 0; e3.value = value; push(e3); } } Element e = pop(); if (top != -1) { printf("Invalid expression!\n"); exit(0); } return e.value; } ``` 到这里,我们就完成了用堆栈队列实现计算器仿真的代码。你可以尝试输入一些表达式进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值