Написать программу, реализующую стек на примере массива - C (СИ)
Формулировка задачи:
Помогите пожалуйста, уже не знаю, что делать. Основной косяк как связать указатели и переменные, так же при вызове функций ошибка в параметрах.
Задание: Написать программу, реализующую стек на примере массива S[N] и стандартные операции со стеком на примере функций push(), pop(), peek(), clear(). Программа должна иметь следующую файловую структуру:
1. файл stack.h 2. файл stack.с 3. файл main.с
1.Файл stack.h
2.Файл stack.c
3.Файл main.c:
int Empty(int * stackPtr, int * top); int Full (int * stackPtr, int * top); int Push (int * stackPtr, int * top, int val); int Pop (int * stackPtr, int * top); int Peek (int * stackPtr, int * top); void Clear(int * stackPtr, int * top); int Empty(int * stackPtr, int * top); int Full (int * stackPtr, int * top); int Push (int * stackPtr, int * top, int val); int Pop (int * stackPtr, int * top); int Peek (int * stackPtr, int * top); void Clear(int * stackPtr, int * top);
#include <stdio.h>
#include "stack.h"
/* реализация функций Empty(), Full(), Push(), Pop(), Peek(), Clear()*/
int Empty(int * stackPtr, int * top)
{
if (top[S] == -1)
return 1;
else
return 0;
}
int Full(int * stackPtr, int * top)
{
if (top[S] == N)
return 1;
else
return 0;
}
int Push(int * stackPtr, int * top, int val)
{
if (Full(int * stackPtr, int * top))
printf ("Error! Stack is full\n");
else {
printf ("Input value of the element\n");
scanf("%d",&x)
top[S] = top[S] + 1;
S[top[S]] = x;
}
return 0;
}
int Pop(int *stackPtr, int *top)
{
if (StackEmpty(int *stackPtr, int *top))
printf ("Error! Stack is empty\n");
else {
x= S[top[S]];
top[S] = top[S] - 1;
return x;
}
int Peek(int *stackPtr, int *top)
{ if (StackEmpty(int *stackPtr, int *top))
printf ("Error! Stack is empty\n");
else {
x= S[top[S]];
return x;
}
void Clear(int *stackPtr, int *top)
{
if (StackEmpty(int *stackPtr, int *top))
printf ("Stack is empty\n");
else
top[S] = -1;
}#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
int main(int argc, char *argv[])
{ int S[10], *stackPtr, *top;
char a;
int x=0, y=0;
// t=⊤
top = (int *)malloc(sizeof(int));
//int *S;
S = (int *)calloc(10, sizeof(int));
*top=-1;
do{
system("cls");
printf( "----Menu----\n1.Push in the stack\n2.Pop from the stack\n3.Peek the last element\n4.Clear the stack\n");
scanf("%d",&x);
switch(x)
{
case 1: Push (S, y); break;
case 2: Pop (S); break;
case 3: Peek (S); break;
case 4: Clear(S); break;
default:
printf ("Wrong entry\n");
}
printf ("To continue, click a\n");
scanf ("%s",a);
}
while (a =='a');
system("PAUSE");
return 0;
}Решение задачи: «Написать программу, реализующую стек на примере массива»
textual
Листинг программы
#include <stdio.h>
#include "intstack.h"
void flush_input(void) {
char c;
while ( scanf("%c", &c) == 1 && c != '\n' )
;
}
int menu(void) {
int ret;
printf("\n0 - exit\n1 - push\n2 - pop\n3 - top\n> ");
if ( scanf("%d", &ret) != 1 ) {
flush_input();
return -1;
}
return ret;
}
int main(void) {
int value, done;
size_t size;
intstack_t * stack;
printf("Stack size: ");
if ( scanf("%lu", &size) != 1 || ! size ) {
fprintf(stderr, "Wrong input!\n");
return 1;
}
if ( ! ( stack = intstack_new(size) ) ) {
fprintf(stderr, "Memory error!\n");
return 1;
}
done = 0;
while ( ! done ) {
switch( menu() ) {
case 0:
printf("Bye!");
done = 1;
break;
case 1:
printf("Value: ");
if ( scanf("%d", &value) != 1 ) {
fprintf(stderr, "Wrong input!\n");
flush_input();
}
else if ( intstack_push(stack, value) )
printf("Stack is full!\n");
else
printf("OK\n");
break;
case 2:
if ( intstack_pop(stack, &value) )
printf("Stack is empty!\n");
else
printf("Got value %d\n", value);
break;
case 3:
if ( intstack_top(stack, &value) )
printf("Stack is empty!\n");
else
printf("Top value: %d\n", value);
break;
default:
fprintf(stderr, "Unknown command!\n");
break;
}
}
intstack_destroy(stack);
return 0;
}
Объяснение кода листинга программы
В данном коде реализована программа для работы со стеком на примере массива. Список функций и их назначение:
- void flush_input(void) - очищает ввод пользователя, позволяет избежать влияния предыдущего ввода на последующий;
- int menu(void) - выводит на экран меню программы и ожидает ввода от пользователя;
- int main(void) - является точкой входа в программу, инициализирует и управляет работой остальных функций;
- intstack_t * stack - указатель на структуру данных, представляющую стек;
- intstack_new(size_t size) - создает новый экземпляр стека указанного размера;
- intstack_push(stack_t * stack, int value) - добавляет новый элемент в стек;
- intstack_pop(stack_t stack, int value) - удаляет и возвращает последний добавленный элемент;
- intstack_top(stack_t stack, int value) - возвращает последний добавленный элемент без удаления;
- intstack_destroy(stack_t * stack) - освобождает память, занятую стеком. Код программы:
- 0 - exit - завершает программу;
- 1 - push - добавляет новый элемент в стек;
- 2 - pop - удаляет и возвращает последний добавленный элемент;
- 3 - top - возвращает последний добавленный элемент без удаления;
- Stack size: - запрос на ввод размера стека;
- Value: - запрос на ввод значения для добавления в стек;
- Got value 123 - вывод значения, которое было добавлено в стек и затем удалено;
- Stack is empty! - вывод сообщения о том, что стек пуст;
- OK - подтверждение успешного добавления элемента в стек;
- Stack is full! - вывод сообщения о том, что стек полон;
- Bye! - завершающее сообщение программы.