字符串入栈出栈

设字符串source,依次进入一个初始为空的栈,在入栈的过程中可以出栈,得到一个出栈字符串dest。设计程序,给出所有可能的入栈出栈的过程。假设入栈用i表示,出栈用o表示。 如: source为:balama dest为:balama 则输出为: i o i i i o o i i o o o  i o i i i o o o i o i o  i o i o i o i i i o o o  i o i o i o i o i o i o   source为:value dest为:lvaeu 则输出为: 输入错误
#include <iostream>
#include <stack>
#include <string>

using namespace std;

const bool PUSH = true;
const bool POP = false;

class Question
{
public:
	void input();
	void solve(unsigned int source_i = 0, unsigned int dest_i = 0, unsigned int op_i = 0);
	Question();
	~Question();
	bool success;
private:
	stack<char> s;
	bool *operations;
	string source, dest, result;
};

void Question::input()
{
	cout << "请输入source:";
	getline(cin, source);
	operations = new bool[2 * source.size()];
	cout << "请输入dest:";
	getline(cin, dest);
	result = dest;
}

void Question::solve(unsigned int source_i, unsigned int dest_i, unsigned int op_i)
{
	char temp;
	if (dest_i == dest.size())
	{
		if (dest == result)
		{
			success = true;
			for (unsigned int i = 0; i < op_i; i++)
				cout << (operations[i] ? 'i' : 'o');
			cout << endl;
		}
		return;
	}
	if (source_i < source.size())
	{
		s.push(source[source_i++]);
		operations[op_i++] = PUSH;
		solve(source_i, dest_i, op_i);
		source_i--, op_i--;
		s.pop();
	}
	if (!s.empty())
	{
		temp = s.top();
		result[dest_i++] = temp;
		s.pop();
		operations[op_i++] = POP;
		solve(source_i, dest_i, op_i);
		dest_i--, op_i--;
		s.push(temp);
	}
}

Question::Question()
{
	operations = NULL;
	success = false;
}

Question::~Question()
{
	if (operations)
		delete [] operations;
}

int main()
{
	Question question;
	question.input();
	question.solve();
	if (!question.success)
		cout << "输入错误!" << endl;
	return 0;
}

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值