Преобразовать стек в два стека - первый должен содержать только чётные числа, второй — только нечётные - C (СИ)
Формулировка задачи:
Здравствуйте!!
Нужно создать стек в диапазоне -50 до 50.Преобразовать стек в два стека.Причем, первый должен содержать только чётные числа,второй - только нечётные.
НА СИ
ПЖЛСТ
вот код для с++
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <stack>
using namespace std;
int main() {
unsigned i, count;
cout << "Count of elements: ";
cin >> count;
srand((int)time(0));
stack<signed char> s1;
for (i = 0; i < count; i++)
s1.push(rand() % 101 - 50);
stack<signed char> s2, s3;
signed char c;
while (!s1.empty()) {
cout << int(c = s1.top()) << endl;
(c & 1? s3: s2).push(c);
s1.pop();
}
cout << endl;
while (!s2.empty()) {
cout << int(s2.top()) << endl;
s2.pop();
}
cout << endl;
while (!s3.empty()) {
cout << int(s3.top()) << endl;
s3.pop();
}
}Решение задачи: «Преобразовать стек в два стека - первый должен содержать только чётные числа, второй — только нечётные»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define bounded_random(l, h) ( rand() % ((h) - (l) + 1) + (l) )
typedef struct NODE {
int value;
struct NODE * next;
} node_t;
int push(node_t ** pStack, const int nValue) {
node_t * pNode = malloc(sizeof(node_t));
if ( ! pNode )
return -1;
pNode->value = nValue;
pNode->next = *pStack;
*pStack = pNode;
return 0;
}
int pop(node_t ** pStack, int * pValue) {
if ( ! *pStack )
return -1;
else {
node_t * pNode = (*pStack)->next;
*pValue = (*pStack)->value;
free(*pStack);
*pStack = pNode;
}
return 0;
}
#define LOW (-50)
#define HIGH (50)
int main(void) {
size_t count;
srand(time(NULL));
while ( printf("Number of elements: ") && scanf("%u", &count) == 1 && count ) {
node_t * all, * even, * odd;
int curr;
all = even = odd = NULL;
while ( count-- ) {
if ( push(&all, bounded_random(LOW, HIGH)) ) {
fprintf(stderr, "Memory error!\n");
exit(1);
}
}
printf("All:\n");
while ( ! pop(&all, &curr) ) {
printf("%d ", curr);
if ( curr & 1 ) {
if ( push(&odd, curr) ) {
fprintf(stderr, "Memory error!\n");
exit(1);
}
}
else {
if ( push(&even, curr) ) {
fprintf(stderr, "Memory error!\n");
exit(1);
}
}
}
printf("\nEven:\n");
while ( ! pop(&even, &curr) )
printf("%d ", curr);
printf("\nOdd:\n");
while ( ! pop(&odd, &curr) )
printf("%d ", curr);
printf("\n");
}
exit(0);
}
Объяснение кода листинга программы
В этом коде:
- Структура
node_tобъявлена как содержащая целочисленное значение и указатель на следующий элемент в стеке. - Функция
pushдобавляет новый элемент в стек. Если выделение памяти для нового элемента не удалось, функция возвращает -1. - Функция
popудаляет и возвращает верхний элемент стека. Если стек пуст, функция возвращает -1. - В основном блоке кода генерируется случайное число в диапазоне от -50 до 50 и добавляется в стек. Этот процесс повторяется, пока пользователь не введёт количество элементов для добавления.
- Затем программа разделяет стек на два новых стека: один для четных чисел, другой для нечетных.
- В конце программа выводит оба стека на экран.