Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 08.01.2015
Сообщений: 1
1

Верна ли реализация push/pop?

08.01.2015, 12:10. Показов 1811. Ответов 2
Метки нет (Все метки)

Правильный ли у меня ход мыслей при написании кода, на тему реализации стека?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ST_VAL 4
 
void push(int **mem, int val) {
    printf("push: %x\n", val);
    **mem = val;
    *mem = ++*mem;
}
 
int pop(int **mem) {
    *mem = --*mem;
    return **mem;
}
 
int main() {
    int *mem = malloc(ST_VAL * sizeof(int));
 
    push(&mem, 0x11111111);
    push(&mem, 0x22222222);
    push(&mem, 0x33333333);
    push(&mem, 0x44444444);
 
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
 
    printf("\n-----------------------------\n\n");
 
    push(&mem, 0x55555555);
    push(&mem, 0x66666666);
    push(&mem, 0x77777777);
    push(&mem, 0x88888888);
 
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
    printf("pop: %x\n", pop(&mem));
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2015, 12:10
Ответы с готовыми решениями:

Реализовать стек, который бы делал push и pop и являлся массивом
Нужно реализовать стек,который бы делал push и pop,и чтобы этот стек был массивом(тобишь можно было...

Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции push, pop
Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции со...

Реализация стека процедур Push и Pop
Реализация стека процедур Push и Pop. help

Сделать так чтобы если вводится push выполнялась функция push, если pop то pop
Помогите пожалуйста с данным вопросом: например у меня есть список и несколько возможных с ним...

__________________
2
3293 / 2355 / 425
Регистрация: 28.04.2012
Сообщений: 7,854
08.01.2015, 14:47 2
Цитата Сообщение от morse_t Посмотреть сообщение
ход мыслей при написании кода
Ход правильный, код неправильный. Например нет проверки выхода за границы стека, соответствеено указатель на начало стека можно просто потерять при неравном количестве вызовов pop и push. Рекомендую создать структуру.

Примерно так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Stack Stack;
typedef int Sitem;
 
Stack* Snew(unsigned int);
void   Sfree(Stack*);
int    Spush(Stack*, Sitem);
int    Spop(Stack*, Sitem*);
 
struct Stack
{
    unsigned int cap;
    unsigned int len;
    Sitem *items;
};
 
Stack*
Snew(unsigned int cap)
{
    Stack *s;
    s = malloc(sizeof(Stack));
    if (s == NULL)
        return NULL;
    s->items = malloc(sizeof(Sitem)*cap);
    if (s->items == NULL) {
        free(s);
        return NULL;
    }
    s->cap = cap;
    s->len = 0;
}
 
void
Sfree(Stack* s)
{
    free(s->items);
    free(s);
}
 
int
Spush(Stack* s, Sitem i)
{
    if (s->len == s->cap) {
        fprintf(stderr, "stack is full\n");
        return 0;
    }
    s->items[s->len] = i;
    s->len++;
    printf("push: %d\n", i);
    return 1;
}
 
int
Spop(Stack* s, Sitem *i)
{
    if (s->len == 0) {
        fprintf(stderr, "stack is empty\n");
        return 0;
    }
    s->len--;
    *i = s->items[s->len];
    printf("pop: %d\n", *i);
    return 1;
}
 
int
main(void)
{
    Stack *s;
    Sitem i;
 
    if ((s = Snew(4)) == NULL) {
        fprintf(stderr, "can't allocate memory\n");
        return 1;
    }
 
    Spush(&s, 1);
    Spush(&s, 2);
    Spush(&s, 3);
    Spush(&s, 4);
 
    Spop(&s, &i);
    Spop(&s, &i);
    Spop(&s, &i);
    Spop(&s, &i);
 
    printf("\n-----------------------------\n\n");
 
    Spush(&s, 5);
    Spush(&s, 6);
    Spush(&s, 7);
    Spush(&s, 8);
 
    Spop(&s, &i);
    Spop(&s, &i);
    Spop(&s, &i);
    Spop(&s, &i);
 
    return 0;
}
Там ошибка, мне некогда исправлять.
0
52 / 11 / 5
Регистрация: 29.10.2013
Сообщений: 102
09.01.2015, 12:56 3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
#define STACK_SIZE 3
 
typedef struct _STACK {
    int *esp;
    int *esp_first;
} STACK, *PSTACK;
 
 
PSTACK init_stack() {
    PSTACK pStack = malloc(sizeof(STACK));
    if (pStack == NULL) {
        printf("pStack: malloc error!");
        exit(EXIT_FAILURE);
    }
 
    pStack->esp = malloc(STACK_SIZE * sizeof(int));
    if (pStack->esp == NULL) {
        printf("pStack->esp: malloc error!");
        exit(EXIT_FAILURE);
    }
 
    pStack->esp_first = pStack->esp;
 
    return pStack;
}
 
 
void deinit_stack(PSTACK pStack) {
    free(pStack->esp);
    free(pStack);
}
 
 
void push(PSTACK pStack, int val) {
    if (pStack->esp == pStack->esp_first + STACK_SIZE) {
        printf("stack overflow!\n");
        exit(EXIT_FAILURE);
    }
 
    *pStack->esp = val;
    pStack->esp++;
}
 
 
int pop(PSTACK pStack) {
    if (pStack->esp == pStack->esp_first) {
        printf("stack empty!\n");
        exit(EXIT_FAILURE);
    }
 
    pStack->esp--;
    return *pStack->esp;
}
 
 
int main() {
 
    PSTACK pStack = init_stack();
 
    push(pStack, 0x11111111);
    push(pStack, 0x22222222);
    push(pStack, 0x33333333);
 
    printf("%x\n", pop(pStack));
    printf("%x\n", pop(pStack));
    printf("%x\n", pop(pStack));
 
    deinit_stack(pStack);
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2015, 12:56

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

push и pop
У меня возникла странная проблема. Мы создали сайт на основе системы управления, которой...

Push, Pop
Вот такое задание: F=Ʃ от 1 до 5 f (Ai) A1=2 Ai+1=Ai+2 Ai=(3*A)+(C/D). Нужно записать эту...

Функции pop и push
Здравствуйте, есть код, решающий задачу. В нем есть стандартные функции push и pop. Как можно...

Работа с push/pop в стеке
Здравствуйте, я тут столкнулся с проблемой, не могу понять, как работать со стеком. Ниже приведу...

PUSH/POP vs MOV из памяти
Какой из двух ниже перечисленных примеров занимает меньше процессорного времени (тактов) ? 1:...

Реализовать стековый массив pop push
Реализовать стек , очень простой с процедурами pop и push


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.