2016-03-15 81 views
0

我有一個堆棧,我想要推送不同的元素。我寫了下面的代碼。但它總是隻檢查第一個元素。如果我輸入重複值第一個值,它不接受,但如果我輸入第二個或第三個值的重複值,它會接受它。 例如,如果我輸入20並再次輸入20,它將不會接受第二個,即 ,但如果我輸入20,22,22,它將接受重複。我怎樣才能防止這一點?防止數組接受重複值

#include <stdio.h> 
#define MAXSIZE 5 

struct stack 
{ 
    int stk[MAXSIZE]; 
    int top; 
}; 
typedef struct stack STACK; 
STACK s; 

void push(void); 
int pop(void); 
void display(void); 

void main() 
{ 
    int choice; 
    int option = 1; 
    s.top = -1; 

    printf ("STACK OPERATION\n"); 
    while (option) 
    { 
     printf ("------------------------------------------\n"); 
     printf ("  1 --> Bus Status    \n"); 
     printf ("  2 --> Enter Bus    \n"); 
     printf ("  3 --> Exit Bus    \n"); 
     printf ("  4 --> EXIT   \n"); 
     printf ("------------------------------------------\n"); 

     printf ("Enter your choice\n"); 
     scanf ("%d", &choice); 
     switch (choice) 
     { 
     case 1: 
      display(); 
      break; 
     case 2: 
      push(); 
      break; 
     case 3: 
      pop(); 
      break; 
     case 4: 
      return; 
     } 
     fflush (stdin); 
     printf ("Do you want to continue(Type 0 or 1)?\n"); 
     scanf ("%d", &option); 
    } 
} 

/* Function to add an element to the stack */ 
void push() 
{ 
    int num,i,j,status=0; 
    if (s.top == (MAXSIZE - 1)) 
    { 
     printf ("Terminal is Full\n"); 
     return; 
    } 
    else 
    { 

     printf ("Enter the Bus Number\n"); 
     scanf ("%d", &num); 
     if(num<1 || num>30) { 
      printf("This bus Does not Exist.\n"); 
     } 
      for(i=0;i<5;i++){ 
       if(s.stk[i]==num){ 
        printf("Bus Already in the Terminal\n"); 
        break; 
       } 
       else { 
        s.top = s.top + 1; 
        s.stk[s.top] = num; 
        status=1; 
        break; 
       } 
      } 
     if(status==1) 
      printf("Bus %d Successfully Entered\n", num); 

    } 
    return; 
} 
+1

你應該學會使用一個調試器並逐行執行代碼。然後,您可以查看程序的狀態並觀察發生的情況。 – crashmstr

+0

完全同意@crashmstr。但是,我會給你一個提示:你必須在推巴士前檢查整個stk - >「else」語句不在正確的位置 – vad

+0

你已經定義了一個常量,這是一個很好的習慣。使用它將是一個更好的做法:'for(i = 0; i <5; i ++)' – MikeC

回答

2

你總線插入循環是通過循環,並增加了總線發現s.stk第一次[I]!= NUM​​。您需要檢查公交車是否在車站內,即在插入新公交車之前搜索整個棧。

for(i=0;i<5;i++) { 
    if(s.stk[i]==num){ 
    printf("Bus Already in the Terminal\n"); 
    break; 
    } 
    else { 
    s.top = s.top + 1; 
    s.stk[s.top] = num; 
    status=1; 
    break; 
    } 
} 
+0

謝謝你,你是對的,我需要搜索整個堆棧。 –