shangji

//栈、顺序栈、链式栈;单链表反转算法
#include<iostream>

using namespace std;

//template<class T>
//class Stack {
//public:
//	void Clear();//清空
//	bool Push(const T item);//压入
//	bool Pop(T& item);//读取、删除栈顶元素
//	bool Top(T& item);//读取栈顶元素
//	bool IsEmpty();//判断是否为空
//	bool IsFull();//判断是否已满
//};

template<class T>
class ArrayStack {
private:
	int maxSize;
	int top;
	T* st;
public:
	ArrayStack(int size) {
		maxSize = size;
		top = -1;
		st = new T[maxSize];
	}
	~ArrayStack() {
		delete[]st;
	}
	void Clear() {
		top = -1;
	}
	bool Push(const T item) {
		if (top == maxSize - 1) {
			T* newst = new T[maxSize*2];
			for (int i = 0; i < maxSize; i++)
				newst[i] = st[i];
			delete[]st;
			st = newst;
			maxSize *= 2;
		}
		st[++top] = item;
		return true;
	}
	bool Pop(T& item) {
		if (top == -1) {
			cout << "栈为空,不能删除栈顶元素" << endl;
			return false;
		}
		item = st[top--];
		return true;
	}
	bool Top(T& item) {
		if (top == -1) {
			cout << "栈为空,不能读取栈顶元素" << endl;
			return false;
		}
		item = st[top];
		return true;
	}
	bool IsEmpty() {
		if (top == -1) 
			return true;
		return false;
	}
	bool IsFull() {
		if (top == maxSize - 1) 
			return true;
		return false;
	}
};

template<class T>
class LinkNode {
public:
	T data;
	LinkNode<T>* link;;
	LinkNode() {}
	LinkNode(const T& el, LinkNode<T>* ptr = 0) {
		data = el;
		link = ptr;
	}
};

template<class T>
class LinkStack {
private:
	LinkNode<T>* top;
	int size;
public:
	LinkStack() {
		top = NULL;
		size = 0;
	}
	~LinkStack() {
		Clear();
	}
	void Clear() {
		while (top != NULL) {
			LinkNode<T>* tmp = top;
			top = top->link;
			delete tmp;
		}
		size = 0;
	}
	bool Push(const T item) {
		LinkNode<T>* tmp = new LinkNode<T>(item, top);
		top = tmp;
		size++;
		return true;
	}
	bool Pop(T& item) {
		LinkNode<T>* tmp;
		if (size == 0) {
			cout << "栈为空,不能删除栈顶元素" << endl;
			return false;
		}
		item = top->data;
		tmp = top;
		top = top->link;
		delete tmp;
		size--;
		return true;
	}
	bool Top(T& item) {
		if (size == 0) {
			cout << "栈为空,不能读取栈顶元素" << endl;
			return false;
		}
		item = top->data;
		return true;
	}
	bool IsEmpty() {
		if (size == 0) 
			return true;
		return false;
	}
	bool invert() {
		LinkNode<T>* p = top, * q = NULL,*r=NULL;
		while (p != NULL) {
			r = q;
			q = p;
			p = p->link;
			q->link = r;
		}
		top = q;
		return true;
	}
	void show() {
		LinkNode<T>* tmp = top;
		while (tmp != NULL) {
			cout << tmp->data << "\t";
			tmp = tmp->link;
		}
		cout << endl;
	}
};




int main() {
	LinkStack<int> a;
	for (int i = 0; i < 10; i++)
	{
		a.Push(i);
	}
	a.show();
	a.invert();
	a.show();
	return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值