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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2008, 20:50   #1
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию Вопрос по стеку на C++

Объясните, почему при реализации стека на С++ используется указатель на указатель на вершину стека. По-моему достаточно просто указателя на вершину стека. Или я чего-то недопонял?

Код:
#include <iostream.h>
 
struct Node {   //структура Node – это список
 int d;         //элемент списка
 Node *p;       //указатель на следующий элемент списка (стека)
 };
 
void push(Node **top, int d);  //функция будет помещать элемент в стек
                               // top – указатель на вершину стека
pop(Node **top);               //функция будет извлекать элемент их стека
                               //вершина которого - top
 
void push(Node **top, int d)   
{ Node *pv = new Node;        //объявляем новую динамическую переменную типа Node
  pv->d=d;                    //записываем  значение, которое помещается в стек
  pv->p=*top;                 //связываем новый элемент стека с предыдущим
  *top=pv;                    //новый элемент стека становится его вершиной
}
 
int pop(Node **top)        
{ int temp=(*top)->d;    //извлекаем в переменную temp значение в вершине стека
  Node *pv=*top;         //запоминаем указатель на вершину стека, чтобы затем 
                         //освободить выделенную под него память   
  *top=(*top)->p;        //вершиной становится предшествующий top элемент
  delete pv;             //освобождаем память, тем самым удалили вершину
  return temp;           //возвращаем значение, которое было в вершине
}
 
 
int main()
{
 char v[24]="25 10 7 3 * + 1 1 + * +";
 clrscr();
 Node *top=0;
 int a,b;
 for (int i=0; i<=23; i++)
 {
    if (v[i] == '+') push(&top,pop(&top)+pop(&top));
    if (v[i] == '*') push(&top,pop(&top)*pop(&top));
    if ((v[i]>='0') && (v[i]<='9'))  push(&top,0);
    while ((v[i]>='0')&&(v[i]<='9')) push(&top,10*pop(&top)+(v[i++]-'0'));
 }
 cout<<pop(&top);
 return 0;
}

Последний раз редактировалось Go6a; 06.04.2008 в 21:31.
Go6a вне форума Ответить с цитированием
Старый 06.04.2008, 21:52   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

ну наверно потому что м ыдобавляем в начало стека, а если написать:
void push(Node *top, int d)
и изменить этот самый top, то при выходе из функции он помоему не изменица, т.к. передаеца не по ссылке, а по значению параметр, т.е. как бы мы ничего и не добавили в стек. так что или по ссылке верхушку стека передавать или указатель на указатель. по-моему тут причина
pu4koff вне форума Ответить с цитированием
Старый 06.04.2008, 22:07   #3
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

Понял, большое спасибо!
Go6a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
вопрос по стеку C++ Mishka Помощь студентам 2 30.06.2008 20:35
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36