2017-03-08 12 views
1

私はCプログラミングの新機能ですが、Cプログラムを使用してスタックを実装しているときにエラーが表示されます。スタックでエラーが発生する(プッシュ&ポップ)

スタック配列に5つの要素スペースがあっても、forループの2番目の繰り返し(While Pushing要素)で「Stack Overflow」(メッセージ)が表示されます。

&

が間違っていると思われるものの番号、最初の番号がポップされる(5回)飛び出しますが?あなたは「ため」が飛び出るプッシュするためのループを使用するべきではありません

#include<stdio.h> 
#include<conio.h> 
#include <stdlib.h> 
# define MAX 5 
int stack1[MAX]; 
int top=-1; 
void push(int); 
int pop(); 
void display(); 
main() 
{ 
int choice,num; 
while(1) 
{ 
    printf("\nEnter Your Choice: \n"); 
    printf("Enter 1. to Push \n"); 
    printf("Enter 2. to pop \n"); 
    printf("Enter 3. to Display \n"); 
    printf("Enter 4. To Exit\n"); 
    scanf("%d",&choice); 
switch(choice) 
{ 

case 1: 
    printf("Enter Elements to be pushed\n"); 
    int z; 
    for(z=1;z<=5;z++) 
    { 
    printf("Enter a the code In Room %d: ",z); 
    scanf("%d",&num); 
    push(num);//Function call, Calling push 
    } 
    break; 
case 2: 
    printf("Numbers to be poped\n"); 
    int b; 
    for(b=1;b<=5;b++) 
    { 
    num=pop(); 
    }//Return a integer Value; 
    break; 

case 3: 
    display(); 
    break; 
case 4: 
    exit(1); 
default: 
    printf("Invalid Choice\n"); 
} 
} 
} 
void push(int element)//Push Function 
{ 
int x; 
for(x=1;x<=5;x++) 
{ 
if(top== MAX-1)//Check if Stack is Full 
{ 
    printf("Stack Overflow \n"); 
    return;//Terminate the function 
} 
top=top+1;//start from -1 and gets incremented 
stack1[top]=element;//insert elements at each step 
} 
} 
int pop() 
{ 
int a; 
for(a=1;a<=5;a++) 
{ 

int element; 
if(top==-1) 
{ 
    printf("Stack EMPTY can't delete anything"); 
    return; 
} 
element=stack1[top];//In stack Elements are Always delete from TOP 
top=top-1;//To shift the pointer 
printf("%d has been deleted \n", element); 
return element; 
} 
} 
void display() 
{ 
int i; 
if(top==-1) 
{ 
    printf("Stack Is empty can't display"); 
    return;//Terminates Display function 
} 
printf("\n\n"); 
for(i=top;i>=0;i--)//Displays top elements and decrements on each step 
    printf("%d\n",stack1[i]); 
} 
+0

そのstackoverflowメッセージは、スタックデータ構造とは関係ありません:) – StoryTeller

答えて

0

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
# define MAX 5 
int stack1[MAX]; 
int top=-1; 
void push(int); 
int pop(); 
void display(); 
main() 
{ 
int choice,num; 
while(1) 
{ 
    printf("\nEnter Your Choice: \n"); 
    printf("Enter 1. to Push \n"); 
    printf("Enter 2. to pop \n"); 
    printf("Enter 3. to Display \n"); 
    printf("Enter 4. To Exit\n"); 
    scanf("%d",&choice); 
switch(choice) 
{ 

case 1: 
    printf("Enter Elements to be pushed\n"); 
    int z; 
    for(z=1;z<=5;z++) 
    { 
    printf("Enter a the code In Room %d: ",z); 
    scanf("%d",&num); 
    push(num);//Function call, Calling push 
    } 
    break; 
case 2: 
    printf("Numbers to be poped\n"); 
    int b; 
    for(b=1;b<=5;b++) 
    { 
    num=pop(); 
    }//Return a integer Value; 
    break; 

case 3: 
    display(); 
    break; 
case 4: 
    exit(1); 
default: 
    printf("Invalid Choice\n"); 
} 
} 
} 
void push(int element)//Push Function 
{ 
int x; 

if(top== MAX-1)//Check if Stack is Full 
{ 
    printf("Stack Overflow \n"); 
    return;//Terminate the function 
} 
top=top+1;//start from -1 and gets incremented 
stack1[top]=element;//insert elements at each step 

} 
int pop() 
{ 
int a; 


int element; 
if(top==-1) 
{ 
    printf("Stack EMPTY can't delete anything"); 
    return; 
} 
element=stack1[top];//In stack Elements are Always delete from TOP 
top=top-1;//To shift the pointer 
printf("%d has been deleted \n", element); 
return element; 

} 
void display() 
{ 
int i; 
if(top==-1) 
{ 
    printf("Stack Is empty can't display"); 
    return;//Terminates Display function 
} 
printf("\n\n"); 
for(i=top;i>=0;i--)//Displays top elements and decrements on each step 
    printf("%d\n",stack1[i]); 
} 
+0

なぜですか?許されないのですか? – harsh97

+0

forが最初の要素を5回ポップしています。あなたのプログラムを編集した方法は意味があります。要素を一度に1つずつ押して、一度に1つずつポップすることができます。すべての要素を一度にプッシュしてポップするのは、スタックに適していません。 – Saran

+0

ええ、私の知っている、しかし、この問題のステートメントを解決するには、私は1つのGOで5つの要素を取る必要がありますので、一回でそれらをポップするので、私はループがそれを行うための最善の方法だと思った。あなたはそれを実装する他の方法を提案することができますか? – harsh97

0

あなたは2つのループがあります。主機能にはスイッチの内側にループがあり、pushpopの機能内にループがあります。

pushおよびpopの機能は、pushまたはpopの1つの要素であり、その内部にループを必要としません。

これは、コードを記述するときにインデントを使用すると、より明らかになります。これは、コードを適切にインデントする理由の1つです。

+0

ええ、私は知っていますが、この問題のステートメントを解決するには、1つの要素で5つの要素を(プッシュする)必要とし、一度にそれらをポップする必要があるので、ループを考えるのが最良の方法であるはずです。他の方法で実装することを提案できます – harsh97

+0

5つの要素をプッシュするメイン関数にはすでにループがあります。プッシュ機能に別のループがある場合は、合計25個の要素をプッシュしようとしています。実際には、配列のサイズが5であるため、最初の要素が5回プッシュされ、4つの要素の残りがプッシュ(それぞれ5回)しようとしますが、スタックがいっぱいになることがあります。あなたがポップすると、最初の要素が5回ポップアウトされます。 –

0

一度に1つのステップを実行しましょう。

1)forループを開始して、ユーザーがスタックに5つの要素を入力できるようにしました。番号を入力すると、プッシュ機能が呼び出されます。プッシュでは、再びループが5回実行されます。したがって、同じ要素がスタックに5回プッシュされています。あなたの次の選択肢では、スタックは既にいっぱいです。したがって、スタックオーバーフローメッセージ。

2)。今あなたのスタックは〜[5,5,5,5,5]のようなものですが、5が入力されたと仮定すると、あなたのポップ関数で再びループを実行しています。理想的には、ユーザーは一度に1つの要素だけをポップすることになっています。だからあなたがループを実行しているので、5つの要素すべてがポップされており、最初の要素だけがスタックに入っているので、出力に表示されます。

+0

それでは、shudがプログラム内でポインタをシフトさせ、繰り返しごとに異なる要素を取り込む(変更する)ように変更しましたか? – harsh97

+0

ユーザーからの要素を受け入れるループ実行が既にあるので、単純にその要素をプッシュ関数に渡します。あなたが現在持っているプッシュ機能では、上で説明した理由のためにforループを削除する必要があります。あなたは単純にその要素を取り、トップ値をインクリメントし、[top] = yourNewValueをスタックします。シンプル。また、ちょうど言及したいと思います.5の配列を定義すると、インデックスは0から始まります。したがって、ループは(i = 0; i <= 4; i ++)のようになります。 [5]は定義されていません。 –

関連する問題