Day8 栈的使用--计算面积 接雨水

题目 → \rightarrow 计算面积
Day8 栈的使用--计算面积 接雨水_第1张图片
输入为 “\///_//\\//\///__\_\//_/”
输出总的积水面积和各积水处面积

思路

首先计算总面积

  • 如果是\,将坐标 i i i压入栈S1
  • 如果是/,取出S1中最近配对的/,算出两者距离 i − i p i-i_p iip并累加到总面积中
  • 如果是_,不做处理

然后计算各个积水处面积
另建栈S2保存各积水处面积,栈S2中每个数据为最左边/的坐标和其对应的积水面积,如果新计算\对应的坐标小于S2栈顶的坐标,那么说明计算的\可以和S2中积水合并。

//计算面积
#include
using namespace std;
int main(){
	//记录最左边\
	
	stack S1;
	//记录\及其对应的面积 
	stack >S2;
	string s3;
	cin>>s3;
	char ch;
	//总面积 
	int sum=0;
	for(int i=0;ij) {
				a+=S2.top().second;
				S2.pop();
			}
			S2.push(make_pair(j,a));
		}
		//ch为-时什么也不做 
	}
	cout<ans;
	while(!S2.empty()){
		ans.push_back(S2.top().second);
		S2.pop();
	}
	for(int i=ans.size()-1;i>=0;--i){
		cout<<" "<

题目 → \rightarrow 接雨水
Day8 栈的使用--计算面积 接雨水_第2张图片
和上一题类似

  • 设栈S存储pair 高度和坐标
  • 如果当前高度小于栈顶S高度,那么计算面积,入栈
  • 如果当前高度大于等于栈顶S高度,依次出栈,计算面积,直到栈空或者有一个大于当前高度,最后入栈。需要注意在该过程中计算面积比较复杂。
class Solution {
public:
    int trap(vector& height) {
    	int sum=0;
    	//高度和坐标 
    	stack >S;
    	for(int i=0;i=S.top().first){
						sum+=(i-S.top().second-1)*S.top().first;
						pair last=S.top();
						S.pop();
						while(!S.empty()&&height[i]>=S.top().first){
							sum+=(i-S.top().second-1)*(S.top().first-last.first);
							last=S.top();
							S.pop();
						}
						if(!S.empty()){
			                sum+=(i-S.top().second-1)*(height[i]-last.first);
						}
					}else{
						sum+=(i-S.top().second-1)*height[i];
					}
					S.push(make_pair(height[i],i));
				}
			}
			
		}
    	return sum;
    }
};

你可能感兴趣的:(刷题,栈)