palindrome(回文:始めから(通常通り)読んでも、終わりから(通常と逆に)読んでも同じ読み方をする分列)を判断するプログラムを作成したいのですが
条件が...
Input : 英語のアルファベットもしくは数字から成り立っているstring
(ただし、大文字小文字の区別はしなくても良い)
必ず stackを 利用して作成。 (連結リストを使う)
abba -> palindrome
Aba -> palindrome
Abcd123 -> not palindrome
Output : 入力された stringが palindromeなのか判別してその結果を出力する。
なのですが、プログラミングが得意な方どなたかご教授お願いします><
No.4ベストアンサー
- 回答日時:
以下のようにしてください。
sample1.c
-------------------------------------------
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[4096];
int i;
int len;
int hantei = 1;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から順に1文字ずつ取り出し、比較する文字をおしりから1文字ずつ取り出す
for (i = 0; i < len;i++){
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if (toupper(buff[i]) != toupper(buff[len-i-1])){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
---------------------------------------------------------------------
sample2.c
------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct data {
char item;
struct data *next;
struct data *back;
} DATA;
//開始ポインター
DATA start;
//最後のデータを取得する
DATA *get_last_data( void )
{
DATA *p = &start;
while(p->next != NULL){
p = p->next;
}
return p;
}
//リストの最後へデータを登録する
void push_data(char item)
{
DATA *last;
DATA *p = malloc(sizeof(DATA));
if (p == NULL){
printf("malloc error\n");
exit(10);
}
//最後のデータ取得
last = get_last_data();
//nextの付け替え
last->next = p;
//最後のデータ登録
p->item = item;
p->next = NULL;
p->back = last;
}
//リストの最後からデータを取り出す
char pop_data( void )
{
char item;
DATA *last;
DATA *prev;
last = get_last_data();
item = last->item;
//1つ前のデータのnextをNULLに設定
prev = last->back;
prev->next = NULL;
//最後のデータを解放
free(last);
return item;
}
int main(void)
{
char buff[4096];
int i;
int len;
char item;
int hantei = 1;
//リストの開始設定
start.next = NULL;
start.back = NULL;
start.item = 0x00;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から1文字ずつスタックに登録
for (i = 0; i < len;i++){
push_data(buff[i]);
}
//先頭から順に1文字ずつ取り出し、比較する文字をスタックから1文字ずつ取り出す
for (i = 0; i < len;i++){
item = pop_data();
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if ( toupper(buff[i]) != toupper(item) ){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
-------------------------------------------
sample3.c
-------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct data {
char item;
struct data *next;
} DATA;
//開始ポインター
DATA start;
//最後のデータを取得する
DATA *get_last_data( void )
{
DATA *p = &start;
return p->next;
}
//リストの最後へデータを登録する
void push_data(char item)
{
DATA *last;
DATA *p = malloc(sizeof(DATA));
if (p == NULL){
printf("malloc error\n");
exit(10);
}
//最後のデータ取得
last = get_last_data();
//最後のデータの付け替え
start.next = p;
//最後のデータ登録
p->item = item;
p->next = last;
}
//リストの最後からデータを取り出す
char pop_data( void )
{
char item;
DATA *last;
DATA *prev;
last = get_last_data();
item = last->item;
//最後のデータの付け替え
start.next = last->next;
//最後のデータを解放
free(last);
return item;
}
int main(void)
{
char buff[4096];
int i;
int len;
char item;
int hantei = 1;
//リストの開始設定
start.next = NULL;
start.item = 0x00;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から1文字ずつスタックに登録
for (i = 0; i < len;i++){
push_data(buff[i]);
}
//先頭から順に1文字ずつ取り出し、比較する文字をスタックから1文字ずつ取り出す
for (i = 0; i < len;i++){
item = pop_data();
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if ( toupper(buff[i]) != toupper(item) ){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
-------------------------------------------------
sample1.cはリストを使わない方法です。
非常にすっきりしていますが、リストを使うことが今回の前提なので、参考程度にしてください。
(回文の判定でリストを使うことがいかに無意味かを知るにはよい材料になるかと)
sample2.cは双方向(next,back)のリストを使っています。双方向のリストを使うことが主な目的なら
この方法になりますが、冗長的です。
sample3.cは単方向(nextのみ)で、かつスタックとして使用することに特化しています。
単方向(nextのみ)で、かつスタックとして使うことが前提ならこの方法になります。
尚、sample2はデータ件数(=入力文字数)が非常に多くなると(約1万件以上)、劇的に遅くなります。
画面から入力する文字数は100桁程度で十分なので、その範囲で使用するには問題ありません。
3つのプログラムは、すべて同じ結果になります。
以下、実行例です。
Input data=>abBa
palindrome
Input data=>abcdegsd3457
not palindrome
No.3
- 回答日時:
要するに、No.1の方のおっしゃる「後ろから読んだ場合」をスタックを使って表現すればいいわけですよね。
たとえば"12345"という文字列を1文字ずつスタックに入れて、
1文字ずつ順番に読み出したらどんな語順になるか。
これで答えはほとんどわかったと思います。
No.1
- 回答日時:
単純に入力された文字列が、前から読んだ場合と後ろから読んだ場合で比較して全て一致すれば、
palindromeと判断すればよいかと思うのですが、いかがでしょうか?
「必ず stackを 利用して作成。 (連結リストを使う)」・・・このようにしないとだめですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- その他(プログラミング・Web制作) Pythonでこのプログラミングを作りたいのですが 1 2022/10/24 18:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
干支のプログラム
-
TCP/IP通信型大文字・小文字変...
-
文字列から空白を取り除きたい...
-
Visual Studio strcpyについて
-
charでの計算?
-
c++ 文字列を入力して、一文字...
-
構造体のアライメント調整
-
DPマッチング
-
Win32APIでのエディットボック...
-
sprintf関数の作り方
-
char型+char型ってint型? if...
-
CStringをwchar_tに変換したい
-
C言語のポインターで詰まっている
-
ランダムな英文字の文字列作成
-
c言語でユーザ関数を利用して入...
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報
今は連結リストのところを学んでいるので
それを使わないといけないみたいです(泣)