堆棧中的剩余數字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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM