您的位置:首页 > 编程语言 > C语言/C++

【c++】说反话加强版【存疑】

2016-03-29 21:36 519 查看
  给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

  测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

  每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come


输出样例:

Come I Here World Hello


解决思路:

建立两个栈a和b,从输入流中读入1个字符,如果不为空格,则将其压入栈a;

如果读入的字符不为空格

2.1 则判断栈a是否为空,如果栈a不为空,则将栈a的元素依次全部出栈,然后压入栈b。栈a为空,什么也不做

2.2 判断栈b是否为空,栈b不为空,则从栈b中出栈一个元素,判断该元素是否为空格,如果该元素为空格,则重新将其压入栈中。如果该元素不为空格,则重新将该元素入栈,同时压入一个空格。

2.3如果栈b为空,则直接压入一个空格。

读入下一个字符,重复过程1,2,直到遇到’\n’;

判断栈a是否为空,不为空,则将a中的元素全部压入b.

将b中的元素打印输出。

程序代码:

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 500
struct stack
{
char data[MAX];
char* top;

};
void initStack(stack &a);
char pushStack(stack &a);
void popStack(stack &a, char c);
int isStackEmpty(const stack &a);
int main()
{
stack a ;
stack b;
initStack(a);
initStack(b);

char temp;
char c;
scanf("%c",&c);
while(c!='\n')
{
if(c!=' ')
popStack(a,c);
else
{
while(!isStackEmpty(a))
{
temp = pushStack(a);
popStack(b,temp);
}
/*if(isStackEmpty(a))
popStack(a,c);*/
if(!isStackEmpty(b))
{
temp = pushStack(b);
if(temp==' ')
popStack(b,temp);
else
{
popStack(b,temp);
popStack(b,' ');
}
}
else
popStack(b,' ');
}
scanf("%c",&c);
}
while(!isStackEmpty(a))
{
temp =pushStack(a);
popStack(b,temp);
}
while(!isStackEmpty(b))
{
temp =pushStack(b);
cout<<temp;
}
return 0;
}
void initStack(stack &a)
{
a.top =a.data;
}
void popStack(stack &a, char c)
{
a.top+=1;
*a.top=c;
}
char pushStack(stack &a)
{
char temp = *a.top;
a.top-=1;
return temp;
}
int isStackEmpty(const stack &a)
{
if(a.top==a.data)
return 1;
else
return 0;
}


这段代码通过了一个测试用例,其他的显示格式错误或者段错误,原因还没找到,存疑。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: