Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2011, 16:49   #1
Kovax
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 28
По умолчанию

Народ, помогите пожалуйста, срочно нужно.
Требуется : Удалить элемент, который находится в середине стека, если нечетное число элементов, а если четное, то два средних

Не знаю как реализовать, застрял. Вряд ли я удаляю элементы из стека.
PS. Заранее премного благодарен.

Код:
program stek;
const max_st=50;
var st:array[1..max_st] of integer;
p,n,l,m,max,i,k:integer;
function empty:boolean;
begin
empty:=n=0;
end;
procedure push(a:integer);
begin
inc(n);
st[n]:=a;
end;
procedure pop(var a:integer);
begin
a:=st[n];
dec(n);
end;
function full:boolean;
begin
full:=n=max_st;
end;
// (основная программа)
begin
m:=1;
writeln('Введите количество элементов');
readln(p);
for i:=1 to p do
begin
writeln('Введите элемент');
readln(l);
if not full then push(l);
end;
if p mod 2=0 then
begin
k:=p mod 2+1;
st[n]:=k;
inc(k);
writeln('Удалено элементов: ',k);
end;
if p mod 2<>0 then
begin
k:=p mod 2+(p mod 2+1);
st[n]:=k;
dec(k);
Writeln('Удалено элементов: ',k);
end;
end.
up <>
Знатокам вроде бы не трудно будет увидеть ошибку.

1. Нужно сделать проверку, если количество элементов четное, то удаляются с середины 2 элемента, если нечетное - 1.
2. Стек перекинуть в массив.
3. Удалить в массиве нужные элементы.
4. Перекинуть значения массива обратно в стек.
Как это реализовать? Переброс в стек вроде понятно, но как сделать проверку, после которой можно удалить элементы из массива?

Если четное кол-во то p mod 2=0 или нечетное p mod 2<>0.

Последний раз редактировалось Stilet; 28.02.2011 в 20:44.
Kovax вне форума Ответить с цитированием
Старый 27.02.2011, 20:27   #2
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Цитата:
1. Нужно сделать проверку, если количество элементов четное, то удаляются с середины 2 элемента, если нечетное - 1.
2. Стек перекинуть в массив.
3. Удалить в массиве нужные элементы.
4. Перекинуть значения массива обратно в стек.
хмм.. не ирационально.
а почему бы сразу не сдельть ввод в массив, проверку а далее удаление и записать в стек?
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 27.02.2011, 20:56   #3
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

сделал как вы просили.
Код:
type ptr=^element;
     element = record
          inf:integer;
          link:ptr;
     end;
var pred,p,pos:ptr;
    i,n,k,j:integer;
    a:array[byte]of byte;
begin
  read(n);
  new(p);
  read(p^.inf);
  p^.link:=nil;
  pred:=p;
  for i:=2 to n do
  begin
       new(p);
       read(p^.inf);
       p^.link:=pred;
       pred:=p;
  end;
  pos:=p;
  i:=n;
  while (p<>nil) do
  begin
        a[i]:=p^.inf;
        p:=p^.link;
        i:=i-1;
  end;
if n mod 2=0 then begin
   for j:=1 to 2 do
   begin
         for i:=(n div 2)+1 to n-1 do
         a[i]:=a[i+1];
   n:=n-1;
   end;
end else
begin
      for i:=(n div 2)+1 to n-1 do
         a[i]:=a[i+1];
         n:=n-1;
end;
pred:=nil;
for i:=1 to n do
begin
     new(p);
     p^.inf:=a[i];
     p^.link:=pred;
     pred:=p;
end;
p:=pos;
while (p<>nil) do
begin
      write(p^.inf,' ');
      p:=p^.link;
end;
end.
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 28.02.2011, 19:53   #4
Kovax
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 28
По умолчанию

Огромное спасибо! Премного благодарен.
Kovax вне форума Ответить с цитированием
Старый 09.03.2011, 16:24   #5
Kovax
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 28
По умолчанию

А если мою программу доделать? Просто нужно сделать не в списке.

Код:
program stek;
const min_st=50;
var st:array[1..min_st]of integer;
n,l,m,g,p,i,j:integer;
function empty:boolean;
begin empty:=n=0;
end;
procedure push (a:integer);
begin
inc(n);
st[n]:=a;
end;
procedure pop(var a:integer);
begin
a:=st[n];
dec(n);
end;
function full:boolean;
begin full:=n=min_st;
end;
begin
m:=1;
writeln('Введите количество элементов: ');
readln (p);
for i:=1 to p do begin
writeln ('Введите элемент: ');
readln (l);
if not full then push (l);
end;
if p mod 2=0 then begin
for j:=1 to 2 do
begin
for i:=(p div 2)+1 to p-1 do
st[i]:=st[i+1];
n:=n-1
 end;
 end else
 begin
 for i:=(p div 2)+1 to p-1 do
st[i]:=st[i+1];
n:=n-1
 end;

writeln(st[i]);
end.
Я не знаю как удалить элементы с середины стека.
Kovax вне форума Ответить с цитированием
Старый 09.03.2011, 18:58   #6
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Цитата:
Сообщение от Kovax Посмотреть сообщение
А если мою программу доделать? Просто нужно сделать не в списке.
в каком чмысле не в списке??
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 09.03.2011, 19:33   #7
Kovax
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 28
По умолчанию

Просто нужно в моем коде доделать отрывок:
Код:
if p mod 2=0 then begin
for j:=1 to 2 do
begin
for i:=(p div 2)+1 to p-1 do
st[i]:=st[i+1];
n:=n-1
 end;
 end else
 begin
 for i:=(p div 2)+1 to p-1 do
st[i]:=st[i+1];
n:=n-1
 end;

writeln(st[i]);
end.
Т.е надо сделать программу, где организованы pop, push, empty и full
Kovax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление элементов ensoleille Помощь студентам 4 16.01.2011 23:27
Вывод на экран двух первых отрицательных элементов стека kwns Общие вопросы C/C++ 2 26.05.2010 10:57
Создание очереди с использованием элементов стека Авторитет Общие вопросы C/C++ 1 11.04.2010 19:33
С++ удаление из стека MaGWaY_minsk Помощь студентам 1 15.11.2009 17:54
Удаление элементов из списка Wi1D Помощь студентам 0 18.05.2009 00:23