#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
// Схема массива: [0] - N, число стеков в массиве
// [1] - размер первого стека, [2] - указатель на верхушку первого стека
// ... повторить [1] и [2] N раз
// [1 + 2N] - начало первого стека, [1 + 2N + [1]] - конец первого стека
// ... повторить N раз
void init_array_params( int * this_array) {
// Ввод числа стеков
int N;
printf ( "\n Type number of stacks: " ) ; if ( ( scanf ( "%d" , & N
) == 0 ) || ( N
< 3 ) ) { }
// Создание временного массива, в котором будут храниться начальные размеры будущих стеков
int * sizes;
sizes
= ( int * ) malloc ( sizeof ( int ) * N
) ; // Ввод начальных размеров стеков
for ( int i = 0 ; i < N; i++ ) {
int tmp;
printf ( "Type size of stack number %d: " , i
) ; if ( ( scanf ( "%d" , & tmp
) == 0 ) || ( tmp
< 2 ) ) { printf ( "\n Error. Try again.\n " ) ; i--;
continue ;
}
sizes[ i] = tmp;
}
// Вычисление длины будущего массива
int size = 1 + N * 2 ; // +длина "заголовка" массива
for ( int i = 0 ; i < N; i++ ) {
size += sizes[ i] ; // +длина каждого из стеков
}
* this_array
= malloc ( sizeof ( int ) * size
) ; // Заполнение заголовка
this_array[ 0 ] = N;
int last_pointer = 1 + N * 2 ;
for ( int i = 0 ; i < N; i++ ) {
this_array[ 1 + i* 2 ] = sizes[ i] ;
this_array[ 2 + i* 2 ] = last_pointer;
last_pointer += sizes[ i] ;
}
}
void print_array( int this_array[ ] ) {
printf ( "\n Number of stacks: %d" , this_array
[ 0 ] ) ; printf ( "\n Length of header: %d" , 1 + this_array
[ 0 ] * 2 ) ; for ( int i = 1 ; i/ 2 < this_array[ 0 ] ; i += 2 ) {
printf ( "\n Size: %d" , this_array
[ i
] ) ; printf ( "\n Pointer: %d" , this_array
[ i
+ 1 ] ) ; }
}
int push( int stack_number, int value, int * this_array) {
if ( ( stack_number < 0 ) || ( this_array[ 0 ] <= stack_number) )
return - 1 ;
// Изменение указателя на верхушку стека
this_array[ 2 + stack_number* 2 ] ++;
int pointer = this_array[ 2 + stack_number* 2 ] ;
// Установка значения по указателю
this_array[ pointer] = value;
printf ( "\n Value %d was pushed to stack #%d\n " , value
, stack_number
) ; return 1 ;
}
int pop( int stack_number, int * this_array) {
if ( ( stack_number < 0 ) || ( this_array[ 0 ] <= stack_number) )
return - 1 ;
// Извлечение значения
int pointer = this_array[ 2 + stack_number* 2 ] ;
int value = this_array[ pointer] ;
// Изменение указателя на верхушку стека
this_array[ 2 + stack_number* 2 ] --;
printf ( "\n Poped value: %d\n " , value
) ; return value;
}
int main( ) {
int * array = NULL;
init_array_params( & array) ;
int menu_pointer = - 1 ;
while ( menu_pointer != 0 ) {
print_array( & array) ;
printf ( "\n \n 1. Push to stack..." ) ; printf ( "\n 2. Pop from stack..." ) ; printf ( "\n ----------------\n " ) ; scanf ( "%d" , & menu_pointer
) ; if ( menu_pointer == 1 ) {
int stack_number = - 1 , value;
printf ( "\n Type stack number(0,1,2...): " ) ; scanf ( "%d" , & stack_number
) ; printf ( "\n Type value to push: " ) ; push( stack_number, value, & array) ;
}
if ( menu_pointer == 2 ) {
int stack_number, value;
printf ( "\n Type stack number: " ) ; scanf ( "%d" , & stack_number
) ; value = pop( stack_number, & array) ;
printf ( "\n ----------------\n " ) ; printf ( "\n Poped value: %d\n " , value
) ; char a;
}
}
return 0 ;
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgoKLy8g0KHRhdC10LzQsCDQvNCw0YHRgdC40LLQsDogWzBdIC0gTiwg0YfQuNGB0LvQviDRgdGC0LXQutC+0LIg0LIg0LzQsNGB0YHQuNCy0LUKLy8gICAgICAgICAgICAgICAgWzFdIC0g0YDQsNC30LzQtdGAINC/0LXRgNCy0L7Qs9C+INGB0YLQtdC60LAsIFsyXSAtINGD0LrQsNC30LDRgtC10LvRjCDQvdCwINCy0LXRgNGF0YPRiNC60YMg0L/QtdGA0LLQvtCz0L4g0YHRgtC10LrQsAovLyAgICAgICAgICAgICAgICAuLi4g0L/QvtCy0YLQvtGA0LjRgtGMIFsxXSDQuCBbMl0gTiDRgNCw0LcKLy8gICAgICAgICAgICAgICAgWzEgKyAyTl0gLSDQvdCw0YfQsNC70L4g0L/QtdGA0LLQvtCz0L4g0YHRgtC10LrQsCwgWzEgKyAyTiArIFsxXV0gLSDQutC+0L3QtdGGINC/0LXRgNCy0L7Qs9C+INGB0YLQtdC60LAKLy8gICAgICAgICAgICAgICAgLi4uINC/0L7QstGC0L7RgNC40YLRjCBOINGA0LDQtwoKdm9pZCBpbml0X2FycmF5X3BhcmFtcyhpbnQgKnRoaXNfYXJyYXkpewogICAgLy8g0JLQstC+0LQg0YfQuNGB0LvQsCDRgdGC0LXQutC+0LIKICAgIGludCBOOwogICAgcHJpbnRmKCJcblR5cGUgbnVtYmVyIG9mIHN0YWNrczogIik7CiAgICBpZiAoKHNjYW5mKCIlZCIsICZOKSA9PSAwKSB8fCAoTiA8IDMpKXsKICAgICAgICBwcmludGYoIlxuRXJyb3IuKlxuICIpOwogICAgICAgIGV4aXQoLTEpOwogICAgfQogICAgLy8g0KHQvtC30LTQsNC90LjQtSDQstGA0LXQvNC10L3QvdC+0LPQviDQvNCw0YHRgdC40LLQsCwg0LIg0LrQvtGC0L7RgNC+0Lwg0LHRg9C00YPRgiDRhdGA0LDQvdC40YLRjNGB0Y8g0L3QsNGH0LDQu9GM0L3Ri9C1INGA0LDQt9C80LXRgNGLINCx0YPQtNGD0YnQuNGFINGB0YLQtdC60L7QsgogICAgaW50ICpzaXplczsKICAgIHNpemVzID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKk4pOwogICAgLy8g0JLQstC+0LQg0L3QsNGH0LDQu9GM0L3Ri9GFINGA0LDQt9C80LXRgNC+0LIg0YHRgtC10LrQvtCyCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGludCB0bXA7CiAgICAgICAgcHJpbnRmKCJUeXBlIHNpemUgb2Ygc3RhY2sgbnVtYmVyICVkOiAiLCBpKTsKICAgICAgICBpZiAoKHNjYW5mKCIlZCIsICZ0bXApID09IDApIHx8ICggdG1wIDwgMikpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yLiBUcnkgYWdhaW4uXG4gIik7CiAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHNpemVzW2ldID0gdG1wOwogICAgfQogICAgLy8g0JLRi9GH0LjRgdC70LXQvdC40LUg0LTQu9C40L3RiyDQsdGD0LTRg9GJ0LXQs9C+INC80LDRgdGB0LjQstCwCiAgICBpbnQgc2l6ZSA9IDEgKyBOICogMjsgICAgICAgICAgICAgICAvLyAr0LTQu9C40L3QsCAi0LfQsNCz0L7Qu9C+0LLQutCwIiDQvNCw0YHRgdC40LLQsAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspewogICAgICAgIHNpemUgKz0gc2l6ZXNbaV07ICAgICAgICAgICAgICAgLy8gK9C00LvQuNC90LAg0LrQsNC20LTQvtCz0L4g0LjQtyDRgdGC0LXQutC+0LIKICAgIH0KICAgICp0aGlzX2FycmF5ID0gbWFsbG9jKHNpemVvZihpbnQpKnNpemUpOwogICAgLy8g0JfQsNC/0L7Qu9C90LXQvdC40LUg0LfQsNCz0L7Qu9C+0LLQutCwCiAgICB0aGlzX2FycmF5WzBdID0gTjsKICAgIGludCBsYXN0X3BvaW50ZXIgPSAxICsgTiAqIDI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKyl7CiAgICAgICB0aGlzX2FycmF5WzEraSoyXSA9IHNpemVzW2ldOwogICAgICAgdGhpc19hcnJheVsyK2kqMl0gPSBsYXN0X3BvaW50ZXI7CiAgICAgICBsYXN0X3BvaW50ZXIgKz0gc2l6ZXNbaV07CiAgICB9CiAgICBmcmVlKHNpemVzKTsKfQoKdm9pZCBwcmludF9hcnJheShpbnQgdGhpc19hcnJheVtdKXsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBwcmludGYoIlxuTnVtYmVyIG9mIHN0YWNrczogJWQiLCB0aGlzX2FycmF5WzBdKTsKICAgIHByaW50ZigiXG5MZW5ndGggb2YgaGVhZGVyOiAlZCIsIDErdGhpc19hcnJheVswXSoyKTsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBmb3IgKGludCBpID0gMTsgaS8yIDwgdGhpc19hcnJheVswXTsgaSArPSAyKXsKICAgICAgICBwcmludGYoIlxuU3RhY2sgIyVkXG4iLCAgICBpLzIpOwogICAgICAgIHByaW50ZigiXG5TaXplOiAlZCIsICAgICB0aGlzX2FycmF5W2ldKTsKICAgICAgICBwcmludGYoIlxuUG9pbnRlcjogJWQiLCAgdGhpc19hcnJheVtpKzFdKTsKICAgICAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgfQp9CgppbnQgcHVzaChpbnQgc3RhY2tfbnVtYmVyLCBpbnQgdmFsdWUsIGludCAqdGhpc19hcnJheSl7CiAgICBpZiAoKHN0YWNrX251bWJlciA8IDApIHx8ICh0aGlzX2FycmF5WzBdIDw9IHN0YWNrX251bWJlcikpCiAgICAgICAgcmV0dXJuIC0xOwogICAgLy8g0JjQt9C80LXQvdC10L3QuNC1INGD0LrQsNC30LDRgtC10LvRjyDQvdCwINCy0LXRgNGF0YPRiNC60YMg0YHRgtC10LrQsAogICAgdGhpc19hcnJheVsyK3N0YWNrX251bWJlcioyXSsrOwogICAgaW50IHBvaW50ZXIgPSB0aGlzX2FycmF5WzIrc3RhY2tfbnVtYmVyKjJdOwogICAgLy8g0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDRg9C60LDQt9Cw0YLQtdC70Y4KICAgIHRoaXNfYXJyYXlbcG9pbnRlcl0gPSB2YWx1ZTsKICAgIHByaW50ZigiXG5WYWx1ZSAlZCB3YXMgcHVzaGVkIHRvIHN0YWNrICMlZFxuIiwgdmFsdWUsIHN0YWNrX251bWJlcik7CiAgICByZXR1cm4gMTsKfQoKaW50IHBvcChpbnQgc3RhY2tfbnVtYmVyLCBpbnQgKnRoaXNfYXJyYXkpewogICAgaWYgKChzdGFja19udW1iZXIgPCAwKSB8fCAodGhpc19hcnJheVswXSA8PSBzdGFja19udW1iZXIpKQogICAgICAgIHJldHVybiAtMTsKICAgIC8vINCY0LfQstC70LXRh9C10L3QuNC1INC30L3QsNGH0LXQvdC40Y8KICAgIGludCBwb2ludGVyID0gdGhpc19hcnJheVsyK3N0YWNrX251bWJlcioyXTsKICAgIGludCB2YWx1ZSA9IHRoaXNfYXJyYXlbcG9pbnRlcl07CiAgICAvLyDQmNC30LzQtdC90LXQvdC40LUg0YPQutCw0LfQsNGC0LXQu9GPINC90LAg0LLQtdGA0YXRg9GI0LrRgyDRgdGC0LXQutCwCiAgICB0aGlzX2FycmF5WzIrc3RhY2tfbnVtYmVyKjJdLS07CiAgICBwcmludGYoIlxuUG9wZWQgdmFsdWU6ICVkXG4iLCB2YWx1ZSk7CiAgICByZXR1cm4gdmFsdWU7Cn0KCmludCBtYWluKCkgewogICAgaW50ICphcnJheSA9IE5VTEw7CiAgICBpbml0X2FycmF5X3BhcmFtcygmYXJyYXkpOwogICAgaW50IG1lbnVfcG9pbnRlciA9IC0xOwogICAgd2hpbGUgKG1lbnVfcG9pbnRlciAhPSAwKXsKICAgICAgICBwcmludF9hcnJheSgmYXJyYXkpOwogICAgICAgIHByaW50ZigiXG5cbjEuIFB1c2ggdG8gc3RhY2suLi4iKTsKICAgICAgICBwcmludGYoIlxuMi4gUG9wIGZyb20gc3RhY2suLi4iKTsKICAgICAgICBwcmludGYoIlxuXG4wLiBFeGl0Iik7CiAgICAgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgICAgIHNjYW5mKCIlZCIsICZtZW51X3BvaW50ZXIpOwogICAgICAgIGlmIChtZW51X3BvaW50ZXIgPT0gMSl7CiAgICAgICAgICAgIGludCBzdGFja19udW1iZXIgPSAtMSwgdmFsdWU7CiAgICAgICAgICAgIHByaW50ZigiXG5UeXBlIHN0YWNrIG51bWJlcigwLDEsMi4uLik6ICIpOwogICAgICAgICAgICBzY2FuZigiJWQiLCAmc3RhY2tfbnVtYmVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcblR5cGUgdmFsdWUgdG8gcHVzaDogIik7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZ2YWx1ZSk7CiAgICAgICAgICAgIHB1c2goc3RhY2tfbnVtYmVyLCB2YWx1ZSwgJmFycmF5KTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lbnVfcG9pbnRlciA9PSAyKXsKICAgICAgICAgICAgaW50IHN0YWNrX251bWJlciwgdmFsdWU7CiAgICAgICAgICAgIHByaW50ZigiXG5UeXBlIHN0YWNrIG51bWJlcjogIik7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZzdGFja19udW1iZXIpOwogICAgICAgICAgICB2YWx1ZSA9IHBvcChzdGFja19udW1iZXIsICZhcnJheSk7CiAgICAgICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAgICAgICAgcHJpbnRmKCJcblBvcGVkIHZhbHVlOiAlZFxuIiwgdmFsdWUpOwogICAgICAgICAgICBjaGFyIGE7CiAgICAgICAgICAgIHNjYW5mKCIlYyIsICZhKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQpyZXR1cm4gMDsKfQ==
compilation info
prog.c: In function 'init_array_params':
prog.c:38:17: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
*this_array = malloc(sizeof(int)*size);
^
prog.c: In function 'main':
prog.c:89:23: warning: passing argument 1 of 'init_array_params' from incompatible pointer type [-Wincompatible-pointer-types]
init_array_params(&array);
^
prog.c:11:6: note: expected 'int *' but argument is of type 'int **'
void init_array_params(int *this_array){
^
prog.c:92:21: warning: passing argument 1 of 'print_array' from incompatible pointer type [-Wincompatible-pointer-types]
print_array(&array);
^
prog.c:50:6: note: expected 'int *' but argument is of type 'int **'
void print_array(int this_array[]){
^
prog.c:104:39: warning: passing argument 3 of 'push' from incompatible pointer type [-Wincompatible-pointer-types]
push(stack_number, value, &array);
^
prog.c:63:5: note: expected 'int *' but argument is of type 'int **'
int push(int stack_number, int value, int *this_array){
^
prog.c:110:39: warning: passing argument 2 of 'pop' from incompatible pointer type [-Wincompatible-pointer-types]
value = pop(stack_number, &array);
^
prog.c:75:5: note: expected 'int *' but argument is of type 'int **'
int pop(int stack_number, int *this_array){
^
prog.c: At top level:
prog.c:119:1: error: expected identifier or '(' before 'return'
return 0;
^
prog.c:120:1: error: expected identifier or '(' before '}' token
}
^
stdout