数据结构(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;
	
}
posted @ 2021-01-25 14:35  _dwt  阅读(32)  评论(0)    收藏  举报