堆栈中的剩余数字C++

向一个空栈中依次存入正整数, 假设入栈元素n(1<=n<=2^31-1)按顺序依次为nx...n4、n3、n2、n1, 每当元素入栈时,如果n1=n2+...+ny(y的范围[2,x],1<=x<=1000),则n1~ny全部元素出栈,重新入栈新元素m(m=2*n1)。

如:依次向栈存入6、1、2、3, 当存入6、1、2时,栈底至栈顶依次为[6、1、2];当存入3时,3=2+1,3、2、1全部出栈,重新入栈元素6(6=2*3),此时栈中有元素6;因为6=6,所以两个6全部出栈,存入12,最终栈中只剩一个元素12。

输入描述: 使用单个空格隔开的正整数的字符串,如"5 6 7 8", 左边的数字先入栈,输入的正整数个数为x,1<=x<=1000。

输出描述: 最终栈中存留的元素值,元素值使用空格隔开,如"8 7 6 5", 栈顶数字在左边。

示例1 输入 5 10 20 50 85 1 输出 1 170 说明 5+10+20+50=85, 输入85时,5、10、20、50、85全部出栈,入栈170,最终依次出栈的数字为1和170。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;;
int main() 
{
	vector<int> a; int len; char c; int sum = 0; a.push_back(0);
	while(scanf("%d",&len))
	{
		a.push_back(len);
		c = getchar();
		if (c == '\n')break;
	}
	len = a.size();
	for(int i=1,j=0;i<len;++i)//i表示入栈数字,j为栈顶;
	{
		sum = 0;
		for(int k=j;k>=0;--k)
		{
			sum += a[k];
			if(sum==a[i])
			{
				a[k] = 2 * a[i]; a[i] = 0;
				for (int m = k + 1; m <= j; ++m)a[m] = 0;
				j = k+1;sum=INT_MIN;
				break;
			}
			if (sum > a[i])break;
		}
		if(sum!=INT_MIN)
		{
			 a[j] = a[i]; a[i] = 0;j++;
		}
	}
	for (int i = len-1; i > 0; --i)if (a[i] != 0)cout << a[i] << " ";cout<<a[0];
	return 0;
}

 

原文链接: https://www.cnblogs.com/nuoyananman/p/16049105.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    堆栈中的剩余数字C++

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/188371

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午2:11
下一篇 2023年2月12日 下午2:12

相关推荐