问题描述 :
问题描述:
-
目的:使用C++模板设计顺序栈的抽象数据类型(ADT)。并在此基础上,使用顺序栈ADT的基本操作,设计并实现简单应用的算法设计。
-
内容:
-
(1)请参照顺序表的ADT模板,设计顺序栈的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的顺序表ADT原型文件,自行设计顺序栈的ADT。)
-
(2)ADT的简单应用:使用该ADT设计并实现若干应用顺序栈的算法设计。
-
-
应用2:若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道)。假设该火车调度站的入口处有n节硬席或软席车厢(分别以Hi和Sj表示,i、j代表各自的序号。)等待调度。要求设计一个算法,使用顺序栈,输出对这n节车厢进行调度的结果序列,使得所有的软席车厢都被调整到硬席车厢的前面,并且软席车厢顺序保持和原来一致,但硬席车厢顺序颠倒。
参考函数原型:
template<class ElemType>
string Conversion(SqStack<ElemType> &S, string &train);
字符串train代表初始的车厢排列序列,车厢和车厢之间以空格分隔。算法函数的返回值为调度结果。
输入说明 :
第一行:初始的车厢排列序列
输出说明 :
第一行:调度结果
输入范例 :
H25 S31 S20 H12 S9 H10 H5 H2 S1
输出范例 :
S31 S20 S9 S1 H2 H5 H10 H12 H25
问题分析
- 软席车厢不变,说明,软席车厢直接不入栈
- 硬席车厢顺序颠倒,硬席车厢全部入栈,然后再出栈
- 遍历整个排序的序列,软席车厢不入栈,硬席车厢入栈,遍历完直接输出栈
使用stream流去实现的字符串的切片和分割
此部分借鉴按照空格切割字符串
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
int main(){
//用于存放分割后的字符串
vector<string> res;
//待分割的字符串,含有很多空格
string word=" Hello, I want to learn C++! ";
//暂存从word中读取的字符串
string result;
//将字符串读到input中
stringstream input(word);
//依次输出到result中,并存入res中
while(input>>result)
res.push_back(result);
//输出res
for(int i=0;i<res.size();i++){
cout<<res[i]<<endl;
}
return 0;
}
if(temp.at(0) == ‘S’)
{
cout<<temp<<" ";
}
else
{
S.push(temp);
}
伪代码实现
void Conversion(SqStack &S, string &train)
{
string temp;
stringstream input;
input << train;
//scan all the elements of the elements
while(input >> temp)
{
if(temp.at(0) == 'S')
{
cout<<temp<<" ";
}
else
{
S.push(temp);
}
}
//pop all the element in the stack
while(!S.StackisEmpty())
{
S.pop(temp);
cout<<temp<<" ";
}
}
事故现场
第一次提交
-
格式不正确,只有一种可能,那就是的如果全部都是软卧,那就会在末尾错多输出一个空格,因为仅仅只对H列表进行了格式控制
-
增加对S格式控制的语句
第四次提交
- 这就很离谱了,还是错的,反而错的更多的,但是没有那么多时间了,就买样例吧
- 是真的扯,他居然在末尾也加了空格,这就很无语了
最后一次提交
分析与总结
- string流比string要好用多了,应该花功夫去研究一下