前言
网上基本都是c++ 栈写的这个题,这里提供一种c语言 栈解法
题目:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/85dd6b7b6c3c0d2751072ba733c5cb90.png)
分析:
这个反话不是逐个字符的反,而是单词反。可以把每一个字符串压入栈中,利用栈的先进后出来实现了,用的顺序栈。
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0;
struct Str {
char Alphbet[81][81];
int top;
int base;
};
typedef struct Str AlpStr;
int main(void) {
char inputStr[81],inputCh;
AlpStr* str = (AlpStr*)malloc(sizeof(AlpStr));
if (!str) return ERROR; // 判断分配是否成功
str->top = str->base = 0; // 先初始化一个空栈
do {
scanf("%s", inputStr);
strcpy(str->Alphbet[str->top++], inputStr);// 字符串拷贝到栈节点中
} while ((inputCh=getchar()) != '\n'); // 判断字符串是否输入完
while (str->top != str->base) {
printf("%s", str->Alphbet[str->top - 1]);
(str->top) - (str->base) == 1 ? printf("") : printf(" "); // 空格判断
str->top--;
}
free(str); // 释放空间
system("pause");
return EXIT_SUCCESS;
}
c++实现:
分析:这个反话不是逐个字符的反,而是单词反。那么只好以空格为分界线,利用栈的先进后出来实现了。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
stack<string> List;
string a;
getline(cin,a);
string cut;
for(int i = 0; i<a.length(); i++)
{
if(a[i]==' ')
{
List.push(cut);//单词入栈
cut="";
}else{
cut+=a[i];
}
}
List.push(cut);//将最后的单词压入栈
while(!List.empty() )
{
cout<<List.top();
List.pop();
if(List.size()!=0)
{
cout<<" ";
}
}
return 0;
}
变种题:
全倒置: (思路简单)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0;
struct Str {
char Alphbet[81];
int top;
int base;
};
typedef struct Str AlpStr;
int main(void) {
char inputCh;
AlpStr* str = (AlpStr*)malloc(sizeof(AlpStr));
if (!str) return ERROR;
str->top = str->base=0;
while ((inputCh=getchar())!= '\n') {
str->Alphbet[str->top++]=inputCh;
}
while (str->top != str->base) {
printf("%c", str->Alphbet[str->top - 1]);
str->top--;
}
system("pause");
return EXIT_SUCCESS;
}