C/C++数据结构-栈的应用

题目详情

假设火车调度站(如图1.1所示)入口处有n节硬席或软席车厢(分别用H、S表示)等待调度,请写一个算法,实现对这n节车厢的调度,使所有的软席车厢都被调整到硬席车厢之前。(可以调用图1.2的基本操作)

 

C/C++数据结构-栈的应用

图1.1-用铁路调度站表示栈

C/C++数据结构-栈的应用

图1.2-栈的基本操作

void   Train_arrange ( char  * train )

{  p=train  ;  q=train ;
InitStack(s);
while ( *p )
{  if (*p==‘H’)             

else                            //把'S'调到前部
p++;
}
while(!StackEmpty(s))
                  

                  

}
}

实现

思想

将所有H车厢先放入容器中等待,迭代到S车厢时,将其车厢放到开头。

算法实现思路

创建两个指针P、q,初始化执行当前第一个车厢。循环迭代P指针,当迭代到S车厢时,将其车厢放到开头,即当前q指针所在位置,随后q指针向后移,否则迭代到H车厢时,将H车厢先放入栈中中等待。最后p指针指向null地址时结束循环,此时q执行最后一个S车厢的后面的车厢。那么我们就可以从栈中取出所有H车厢放入q指针所指位置,随后q向后移动。最终即可做到使所有的软席车厢都被调整到硬席车厢之前。

题目难点

笔者认为此算法并不算太难,主要难在题目要求一空一行代码,再加上笔者对C++不熟,一时半会想不出。

代码

// 栈-火车站调度.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<stack>
using namespace std;

void Pop(stack<char> &s, char& e)
{
	e = s.top();
	/*std::cout << s.top() << std::endl;*/
	s.pop();
}
void Push(stack<char> &s, char e)
{
	s.push(e);
}

void   Train_arrange(char* train)
{
	char* p = train;  char* q = train;
	stack<char> s;
	while (*p)
	{
		if (*p == 'H') { Push(s, *p); }
		else { *q++ = *p; }                           //把'S'调到前部
		p++;
	}
	std::cout << train << std::endl;
	std::cout << train << std::endl;
	while (!s.empty())
	{
		Pop(s, *q);
		++q;
	}
}


int main()
{
	char train[]= "HHSSHSHS";
	Train_arrange(train);
	std::cout << train << std::endl;
	return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 

给TA打赏
共{{data.count}}人
人已打赏
开发

lua系统学习03-变量类型

2023-9-15 17:38:05

开发

C++语言基础入门(2) – 运算符

2023-9-15 17:40:53

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索