数据结构1: 栈

本文介绍了栈这种遵循FILO原则的线性数据结构,讨论了其特点,如只能在栈顶进行操作,以及使用数组和单链表两种实现方式的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特点

栈(Stack)是一种线性存储结构

栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。

只能在栈顶进行插入和删除。

操作

  1. 入栈:把新元素压入栈顶
  2. 出栈:弹出栈顶元素
  3. 求栈的大小
  4. 获取栈顶元素

 实现方式

  1. 用数组实现(有空间限制,但是代码简单)
  2. 用单链表实现

代码

用数组实现:

template<typename T>
class Stack {
public:
	typedef T value_type;
	typedef size_t size_type;

private:
	T* data;  // 栈中数据
	size_type tt = -1;  // 栈顶元素的下标
	size_type cap; // 栈的容量
	size_type ssize;  // 栈的实际大小
	// 为栈分配空间
	void alloc(size_type sz) {
		this->data = new value_type[sz];
		this->cap = sz;
	}
public:
	// 构造函数
	Stack(size_type capacity = 20) {
		ssize = 0;
		this->alloc(capacity);
	}

	// 入栈
	bool push(value_type v) {
		if (tt + 1 >= cap) return false;   // 溢出
		this->data[++tt] = v;
		ssize++;
		return true.
	}

	// 出栈
	bool pop() {
		if (tt < 0) return false;  // 下溢
		tt--;
		ssize--;
		return true;
	}

	// 获取栈顶
	value_type top() {
		return this->data[tt];
	}

	// 获取大小
	size_type size() {
		return ssize;
	}

	// 是否为空
	bool empty() {
		return tt < 0;
	}

    // 释放栈占用的空间
    void free(){
        delete [] data;
    }

    ~Stack(){
        free();
    }
};

 用链表实现:

template<typename T>
class LinkedStack {
public:
	typedef T value_type;
	typedef size_t size_type;
private:
	struct Node {
		value_type data;
		Node* next;
	};
	Node* head, *p; // 记录头节点和当前点
	size_type ssize;
public:
	LinkedStack() {
		head = NULL;
		ssize = 0;
	}

	void push(value_type v) {  //入栈
		Node* q = new Node;
		q->data = v;
		if (head == NULL)
		{
			q->next = head;
			head = q;
			p = q;
		}
		else
		{
			q->next = p;
			p = q;
		}
		ssize++;
	}
	
	void pop() {  // 出栈
		if (ssize) {
			Node* q;
			q = p;
			p = p->next;
			delete q;
			ssize--;
		}
	}

	size_type size() {  // 栈大小
		return ssize;
	}

	value_type top() {   // 栈顶
		return p->data;
	}

	bool empty() {   // 是否为空
		return ssize > 0;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值