2017-11-27 7 views
1

のために働いていない、誰もがいただきました問題を伝えることができます!スタックを使用して文字列を逆にするので、私は、スタックを使用して文字列を逆にするコードを足すましたが、出力は常に</p> <p>違って見える私

私はハローのような文字列を書くときに出力が「olleh」である必要がありますが、その「OLLO」 ことが

コードが起こって、なぜ任意のアイデアがある:

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_SIZE 101 

void push(char); 
void pop(); 
char Top(); 
void print(); 



char A[MAX_SIZE]; 
int top=-1; 

void rev(int n) 
{ 
    int i; 
    for(i=0; i<n; i++){ 
     push(A[i]); 
    } 
    for(i=0; i<n; i++){ 
     A[i]=Top(); 
     pop(); 
    } 

} 

void main() 
{ 

    printf("enter a string: "); 
    gets(A); 
    rev(strlen(A)); 
    printf("output= %s",A); 
} 

void push(char a) 
{ 
    if (top == MAX_SIZE -1){ 
     printf("Error: stack overflow\n"); 
     return; 
    } 
    A[++top] = a; 
} 

void pop() 
{ 
    if(top==-1){ 
     printf("Error: stack is empty\n"); 
     return; 
    } 
    top--; 
} 

char Top() 
{ 
    return A[top]; 
} 

void print() 
{ 
    int i; 
    printf("Stack: "); 
    for(i=0;i<=top;i++){ 
     printf("%d ",A[i]); 
    } 
    printf("\n"); 
} 

これが出力されます

the output

+1

を使用する必要がある場合、私は[あなたをお勧めしますあなたのプログラムをデバッグする方法を学んでください](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+1

また、決して*決して*使用することはありません。危険な機能なので、C標準から削除されました。例えば['fgets'](http://en.cppreference.com/w/c/io/fgets)を参照してください。 –

+4

最後にあなたの問題について:文字列*と*のスタックに 'A' *両方*を使用します。それはうまく動作しません。 –

答えて

1

screenshootにあなたはほとんどそこにいます!すべての

まず、代わりに

fgets(A,MAX_SIZE,stdin); 

その後、逆の機能はほとんど大丈夫ですが、あなたは同じ文字列を上書きされ、再使用(fgetsのを使用して、)(危険が取得する使用していません文字列の半分から)文字列をコピーしただけです(スタック/文字列の)。

S[...]

A[...]を置き換える、プッシュ/ポップ/トップ使用中の別の配列

char A[MAX_SIZE]; // input string 
char S[MAX_SIZE]; // stack 

のみスタックのスタックを作成します。popを持つ、Top()なしpop()を使用することがよりエレガントになりますスタックの「トップ」から文字を返します。

char pop(); 
char pop() { 
    if(top==-1){ 
     printf("Error: stack is empty\n"); 
     return 0; 
    } 
    return S[top--]; 
} 
+0

ありがとう – AhmeDSeddiK

0

ある

for(i=0; i<n; i++){ 
    A[i] = pop(); 
} 

pop()プッシュ機能は、ユーザ入力

ための別の変数を追加してください。その後、「チャーAを[]」を有するのと同じ変数に追加されているのでスタック

詳細説明:「hello」を逆に開始した場合、push関数は "h"を "o"に置き換え、tあなたは

0

問題は、あなたが途中で内容

ABC 

プッシュAを上書きしているあなたは から読んでいるものと同じで、あなたのポップ関数はスタックを直接アクセスすることである見るものの帽子の0から2

に、プッシュB、Cを押して、トップは今、2

C A[2] 
B A[1] 
A A[0] 

あるので、あなたのループ

A[0] = Top() ; 

今あなたは[0] 'Aが' [2] 'C' で上書きされていますが、以前の値を保存しない ''

スタックの内容は

A[2] C 
A[1] B 
A[0] C 
のように見えます

最も簡単なだけで、あなたのスタックを横断する二番目の配列

char B[MAX_SIZE] 

を持っているために、この

ような何かをされます10
for (i = top, j = 0; i >= 0; --i) 
{ 
    B[j++] = A[i]; 
} 

(altがトップの値を返すポップ機能を行う)

あなたは(どんな学問的理由で)唯一の配列 スワップ値

for (i = top, j = 0; i >= 0; --i) 
{ 
    if (i != j) 
    { 
    tmp = A[j]; 
    A[j] = A[i]; 
    A[i] = tmp; 
    } 
} 
関連する問題