Помощь - Поиск - Пользователи - Календарь
Полная версия: Динамические структуры данных
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
CormiX
Помогите пожалуйста переделать список в стек.
program lab9;
uses crt;
type
	Link = ^List;
	List =	record
			next: Link;
			data: string;
			NumRand: integer;
			end;
var
	i:integer;
	TopElement: Link;
	tocase:byte;
	doexit:boolean;
	


function DataAsk : string;
begin
	Write('Vedit dani:');
	Readln(DataAsk);
end;

procedure DataCreate(pdata:string);
begin
	TopElement:=New(Link);
	TopElement^.data := pdata;
	TopElement^.NumRand := Random(10000);
	TopElement^.next := nil;
end;

procedure DataAdd(pdata:string);
var temp: Link;
begin
	temp := new(Link);
	temp^.data := pdata;
	temp^.NumRand := Random(10000);
	temp^.next := TopElement;
	TopElement := temp;
end;

procedure DataDel;
var temp: Link;
begin
	temp := TopElement;
	if temp^.next=nil then
	begin
		writeln('Stek pustij.');
		TopElement := nil
	end
	else
	begin
		temp := temp^.next;
		TopElement := temp;
	end;
end;


procedure Show;
var temp : Link;
begin
	temp := TopElement;
	while temp <> nil do
	begin
		writeln('Dani: ', temp^.data, ' - ', temp^.NumRand);
		temp:=temp^.next;
	end;
end;

procedure ShowNData;
var temp : Link;
	n : word;
begin
	write('Veditj №: ');
	readln(n);
	temp := TopElement;
	for i:=1 to n do
	begin
		if i=n then writeln('Dani: ', temp^.data, ' - ', temp^.NumRand);
		if temp=nil then
		begin
			writeln('Ne znajdeno poziciji №: ', n);
			break;
		end;
		temp:=temp^.next;
	end;
end;

procedure Search;
var temp : Link;
	stext: string;
	isfind : boolean;
begin
	write('Veditj wukanij tekst: ');
	readln(stext);
	temp := TopElement;
	while temp <> nil do
	begin
		if temp^.data=stext then
		begin		
		writeln('Znajdeno: ', temp^.data, ' - ', temp^.NumRand);
		isfind := true;
		end;
		temp:=temp^.next;
	end;
	if isfind <> true then writeln('Zapys (', stext ,') ne znajdeno.');
end;

begin
	repeat
		clrscr;
		writeln('Oberitj diu');
		writeln;
		writeln('1.Novij zapys.');
		writeln('2.Dodaty zapys.');
		writeln('3.Vydalyty.');
		writeln('4.Vyvesty zapys novyj.');
		writeln('5.Vyvesty vsi dani.');
		writeln('6.Powuk.');
		writeln;
		writeln('0.Vyjty.');
		writeln;
		write('Vykonaty diu nomer: ');
		readln(tocase);
		case tocase of
			1:DataCreate(DataAsk);
			2:DataAdd(DataAsk);
			3:DataDel;
			4:ShowNData;
			5:Show;
			6:Search;
			0:doexit:=true
			else writeln('Pomylka!')
		end;
		writeln('Diu ', tocase,' vykonano. Enter - prodov*yty');
		readln;
    until doexit;
	
	
end.


volvo
У стека нет того функционала, который есть у списка, и который подразумевается в твоей программе. Стек умеет только запихивать в себя одно значение (Push), выталкивать последнее записанное значение (Pop), и, иногда, просматривать значение, занесенное в стек последним (функция Top). Никакого поиска, никакого удаления элемента из середины стека...

Кстати, это только я не вижу задания, или его здесь действительно нет?
CormiX
Ну то что стек "Посл. вошел - первый вышел, это я понимаю". Нет задания простите. Мне просто нужно переделать програмку в стек. Только я не понимаю как, и очень хотел бы чтоб мне с этим помогли.
volvo
Что значит
Цитата
просто нужно переделать програмку в стек.
? Что программка делать должна? То же самое, что и сейчас - это невозможно со стеком. Дальше что?
CormiX
Ну нужно чтоб программа создавала стек, считывала с него вершину, можно было добавить елемент в стек и показать все его елементы.
Немного есть:
program STACK_Pr;
Uses Crt;
type
  PStack = ^TStack;
  TStack  = record
              chislo: integer;
              next  : PStack;
         end;
var
  x, Stack : PStack;
  i  : integer;
Procedure INPUT_STACK;
begin
  ClrScr;
  Stack := nil;
  for i := 1 to 10 do
  begin
      New(x);
      write ('Veditj ', i, ' 4islo ');     readln(x^.chislo);
      x^.next := Stack;     Stack:=x;
  end;
end;
Procedure OUTPUT_STACK;
begin
    if Stack = nil
       then writeln('Pustij stek!')
       else   begin
                     x := Stack;
                     while x<> nil do
                    begin
                        Write(x^.chislo,' ');
                        x := x^.next;
                  end;
              end;
end;
begin
  INPUT_STACK;
  OUTPUT_STACK;
  Repeat Until keypressed;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.