数据结构(0)-Stack的实现
Stack 的实现:
#include<iostream>
template<typename T>
class Stack{
public:
Stack():top(NULL){}
inline bool empty(){return !top;}
inline T getTop(){return top->data;}
bool pop(){
if(empty())return 0;
Node* p=top;
top=p->next;
delete p;
return 1;
}
bool pop(int& x){
if(empty())return 0;
x=top->data;
Node* p=top;
top=p->next;
delete p;
return 1;
}
void push(const T& x){
Node* p=new Node;
p->next=top;
p->data=x;
top=p;
}
private:
struct Node{
T data;
Node* next;
}* top;
};
说一下思路: 这是我自己写的栈的代码, 参考了之前看的数据结构书. 栈其实是一个宏观的表, 而表中的元素才是我们在栈中存取的内容. 首先要理清这一层关系.
1.数据:
1.如何设计一个栈? 那必然要提供三种栈操作:empty() pop() push() ,由于FILO特性, 栈操作其实是对顶指针top的操作.
2.自然地考虑用带next指针和数据的结构类型作为栈元素.(只有一端可以操作的链表)
Node中的data存数据, 而next存储数据之间的逻辑关系. 所以打包结构Node*型top指针作class Stack的成员, 供成员函数访问.
2.函数:
只分析push和pop的实现:
1.push():
push操作理论上一定可以(只要不overflow), 栈增加一个Node, 因此动态申请一块内存. 然后旧top变成新next;新Node变成top.
void push(const T& x){
Node* p=new Node;
p->next=top;
p->data=x;
top=p;
}
2.pop():
pop操作只有对非空栈才合法.若非空,则删除top节点, 并且将next设为新top.
bool pop(T& x){
if(!top)return 0;
x=top->data;
Node* p=top;
top=p->next;
delete p;
return 1;
}
测试代码:
int main() {
Stack<int> s;
cout << s.empty() << endl;
s.push(1);
s.push(2);
s.push(3);
cout << s.empty()<<endl;
for (int i = 0; i < 3; i++) {
int x;
s.pop(x);
cout << x << endl;
}
cout << s.empty()<<endl;
}