Удалить последний введенный четный номер из массива, используя стек - PullRequest
0 голосов
/ 28 сентября 2019

Я новичок в программировании на Си.Я делаю программу, которая будет вводить числа и удалять последние введенные четные числа из массива, используя стек или метод push-pop.

Проблема в том, что я не могу вытолкнуть последний четный номер, и я не знаю, что не так.

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int top = -1;
int stack[MAX];

void deleteEven(int num[], int i);

int main() {
  int num[100];
  int i, size;

  printf("\n-----------------\n\n");
  printf("Enter size of array: ");
  scanf("%d", &size);

  for (i = 0; i < size; i++) {
    printf("Enter number: ");
    scanf("%d", &num[i]);
    top++;
    stack[top] = num[i];
  }
  printf("\nList: ");
  for (i = 0; i < size; i++) {
    printf("%d, ", num[i]);
  }
  printf("\n");
  printf("Even: ");
  for (i = 0; i < size; i++) {
    if (num[i] % 2 == 0) {
      printf("%d, ", num[i]);
    }
  }
  deleteEven(num, i);
  return 0;
}

void deleteEven(int num[], int i) {
  printf("\nAnswer: ");
  if (num[i] % 2 == 0) {
    stack[top--];
  }

  for (int j = top; j >= 0; --j) {
    printf("%d, ", stack[j]);
  }
}

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Я реализовал рабочий в C с реализацией в вашем коде, вы можете увидеть ниже.Я добавил int checkEven(int stack[], int stackSize) функцию, которая контролирует массив, если есть какое-либо четное число или нет.Если нет, то завершите проблему с возвратом 0 или любого другого кода ошибки, с другой стороны, если есть четное число, он возвращает его индекс и функция deleteEven проведет пальцем по массиву (stack).Это работает для size of 5 массива, но вы можете это исправить.Для простоты тестирования я использую 5.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 5

int top = -1;
int stack[MAX];

void deleteEven(int num[], int indexOfEven);
int checkEven(int stack[], int stackSize);

int main() {
  int num[5];
  int i, size;

  printf("\n-----------------\n\n");
  printf("Enter size of array: ");
  scanf("%d", &size);

  for (i = 0; i < size; i++) {
    printf("Enter number: ");
    scanf("%d", &num[i]);
    top++;
    stack[top] = num[i];
  }
  printf("\nList: ");
  for (i = 0; i < size; i++) {
    printf("%d, ", num[i]);
  }
  printf("\n===stack===");
  for( i = 0; i <size; i++){
    printf("%d ", stack[i]);
  }

  int indexOfEven = checkEven(stack,5);
  if(indexOfEven >= 0){
    printf("This sequence has even number");

    printf("the index => %d ",indexOfEven);

    deleteEven(stack, indexOfEven);



  }else{
    printf("this sequence has no even number");
    /*
      no even number
      exit
    */
    return 0;
  }

  return 0;
}

int checkEven(int stack[], int stackSize){
  for(int i = stackSize - 1; i >= 0; i--){
    if(stack[i] % 2 == 0){
      return i;
    }
  }
  return -1;
} 

void deleteEven(int num[], int indexOfEven) {

  int simpleArray[5];
  for(int t = 0; t < 5; t++){
    simpleArray[t] = num[t];
  }

  int c;
  for (c = indexOfEven; c < 4; c++)
    simpleArray[c] = num[c+1];


  for (c = 0; c < 4; c++){
    printf("\n%d\n", simpleArray[c]);
  }

}

Пока что вы видите реализацию O(n) с массивом, но вы описываете, что хотите реализовать ее с помощью механизма стека push() - pop() - peek().Я хочу написать код sudo для полной реализации Stack.

let it inputs be 1 - 2 - 3 - 5 - 7 

describe inputSize
describe mainStack
describe helperStack

read inputs to mainStack

показать стеки

mainStack -> [1-2-3-5-7]

helperStack -> []

while mainStack.peek() != NULL :
    if mainStack.peek() % 2 == 0:      // even number
       mainStack.pop()
       break the loop
    else:
       describe popValue = mainStack.pop()
       helperStack.push( popValue ) 


if inputSize == helperStack: 
     // no even number 
     // so nothing break the loop, every value is odd so, all there is another stack 
     // finish program with error code or return main array / inputs 

показать стеки

mainStack -> [ 1 ]

helperStack -> [ 3 5 7 ]

сейчас pop() все helperStack и нажатьmainStack

while helperStack.peek() != NULL:  
    mainStack.push( helperStack.pop() )

Показать стеки

 mainStack -> [ 1 3 5 7 ]

 helperStack -> [ ]

Вернуть mainStack в качестве формата массива.

0 голосов
/ 28 сентября 2019

Похоже, что последний цикл перед вызовом deleteEven будет увеличивать i до конца массива stack независимо от того, является ли последний номер четным или нет, потому что все, что вы делаете, проверяет, является ли текущий номердаже и потом печатать его, и сразу после этого переходить к следующему.он будет перебирать все числа, что приведет к вызову deleteEven с последним индексом массива.

как насчет перехода от последнего элемента массива к индексу 0 (в обратном направлении) и печатипервое знакомство с четным числом?

Кроме того, не совсем уверен, почему вы используете два разных массива и копируете элементы один за другим после использования scanf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...