100000605 - 《算法笔记》7.1小节——数据结构专题(1)->栈的应用

《算法笔记》7.1小节——数据结构专题(1)->栈的应用
1918 Problem A 简单计算器

#include <iostream>
#include <stdio.h>
#include <stack>
#include <queue>
#include <string>
#include <map>
#include <algorithm>
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()-1; it != str.begin(); it--)
			if (*it == ' ') str.erase(it);
		while (!s.empty()) s.pop();	//初始化栈
		change();
		printf("%.2f\n", cal());
	}
	return 0;
}

1982 Problem B Problem E

#include <stdio.h>
#include <string>
#include <stack>
#include <iostream>
using namespace std;

struct node {
	double num;
	char op;
	bool flag;
};

bool judge() {
	string str;
	stack<char> s;
	bool flag = true;
	cin >> str;

	for (string::iterator it=str.begin(); it != str.end();it++) {
		char temp;
		if (s.size() == 0) s.push(*it);		//栈为空时单独处理,否则会越界
		else {
			if (*it == '(' || *it == '[' || *it == '{') s.push(*it);
			else if (*it == ')') {
				temp = s.top();
				if (temp == '(')  s.pop();
				else {
					flag = false;
					break;
				}
			}
			else if (*it == ']') {
				temp = s.top();
				if (temp == '[')  s.pop();
				else {
					flag = false;
					break;
				}
			}
			else if (*it == '}') {
				temp = s.top();
				if (temp == '{')  s.pop();
				else {
					flag = false;
					break;
				}
			}
		}
	}
	if (s.size() != 0) flag = false;
	return flag;
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		bool flag=judge();
		if (flag == true) printf("yes\n");
		else printf("no\n");
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值