[英]Implementation of stack in C++ without using <stack>
我想做一個堆棧的實現,我在互聯網上找到了一個工作模型,不幸的是它基於我知道我想立即實現的堆棧大小的想法。 我想要做的是能夠在需要時將段添加到我的堆棧中,因為所需的插槽的最大數量可能達到 10 萬個,並且根據我的理解,使大小一成不變(當不需要所有這些時)大多數時候)是對內存的巨大浪費和程序執行速度的損失。 我也不想在我的實現中使用任何復雜的預寫函數(STL 提供的函數或不同的庫,如 vector 等),因為我想通過嘗試自己/在簡短的幫助下自己制作它們來更多地了解它們。
struct variabl {
char *given_name;
double value;
};
variabl* variables[50000];
int c = 0;
int end_of_stack = 0;
class Stack
{
private:
int top, length;
char *z;
int index_struc = 0;
public:
Stack(int = 0);
~Stack();
char pop();
void push();
};
Stack::Stack(int size) /*
This is where the problem begins, I want to be able to allocate the size
dynamically.
*/
{
top = -1;
length = size;
z = new char[length];
}
void Stack::push()
{
++top;
z[top] = variables[index_struc]->value;
index_struc++;
}
char Stack::pop()
{
end_of_stack = 0;
if (z == 0 || top == -1)
{
end_of_stack = 1;
return NULL;
}
char top_stack = z[top];
top--;
length--;
return top_stack;
}
Stack::~Stack()
{
delete[] z;
}
我有一些想法,並嘗試做
Stack stackk
//whenever I want to put another thing into stack
stackk.push = new char;
但是后來我並沒有完全理解它如何為我的目的工作,我認為它不能通過 pop 方法等完全訪問,因為它將是一組單獨的數組/變量,對嗎? 我希望實現保持相當簡單,以便我能夠理解它。
更改push
函數以獲取參數,而不是需要引用variables
。
要處理推送,請從數組z
的初始長度開始(並將z 更改為更好的變量 name )。 當您推送新值時,請檢查新值是否意味着數組的大小太小(通過比較length
和top
)。 如果它將超過當前大小,則分配一個更大的數組並將值從z
復制到新數組,釋放z
,並使 z 指向新數組。
這里有一個簡單的實現,不需要重新分配數組。 它使用輔助類 Node,它保存一個值,以及一個指向另一個 Node 的指針(設置為 NULL 以指示堆棧的結尾)。
main() 通過讀取表單的命令來測試堆棧
g: 打印棧頂並彈出
#include <cstdlib> #include <iostream> using namespace std; class Node { private: char c; Node *next; public: Node(char cc, Node *nnext){ c = cc; next = nnext; } char getChar(){ return c; } Node *getNext(){ return next; } ~Node(){} }; class Stack { private: Node *start; public: Stack(){ start = NULL; } void push(char c){ start = new Node(c, start); } char pop(){ if(start == NULL){ //Handle error cerr << "pop on empty stack" << endl; exit(1); } else { char r = (*start).getChar(); Node* newstart = (*start).getNext(); delete start; start = newstart; return r; } } bool empty(){ return start == NULL; } }; int main(){ char c, k; Stack st; while(cin>>c){ switch(c){ case 'p': cin >> k; st.push(k); break; case 'g': cout << st.pop()<<endl; break; } } return 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.