基于C++的数据结构-5-链式栈

链式栈基础知识

把栈组织成一个单链表,即采用链接结构来表示栈,这样的数据结构就叫做链接栈。
栈的链接结构一般通过单向链表来实现。在单向链表中,每一个节点表示栈中的元素。由于栈是在链表头部进行插入删除,所以链式栈不需要设置头结点,栈顶指针通常用top表示,这是它的唯一指针。
由于链接栈具有动态分配元素结点的特点,所以在内存足够大的情况下,可以认为链接栈中最大元素个数没有限制,所以在单向链表中不用**isFull()**去判断是否满溢出。

栈图示

基本操作

在单向链表中,使用较多的是进栈和出栈。进栈就是向链接栈的栈顶插入一个元素结点,先将待进栈结点的指针域指向原来的栈顶节点,然后将栈顶节点指针top指向新结点,是进栈元素结点成为新的栈顶节点;
出栈就是从链接栈的栈顶删除一个元素结点,先将栈顶元素取出放到x中,然后使栈顶指针top指向原栈顶节点的后继结点,然后从物理上删除该结点即可。
top为空时,代表栈空,否则就代表还有元素处于栈中。

代码示例

进栈 LinkNode是节点类,T表示数据类型

bool push(const T& x){
	LinkNode<T> *p=new LinkNode<T>;
    if(p==NULL){
    	return false;
    }
    else{
    	p->data=x;
        p->next=top;
        top=p;
        size++;
        return true;
    }
}

出栈 LinkNode是节点类,T表示数据类型

bool pop(T& x){
	LinkNode<T> *p;
    if(Isempty()){
    	return false;
    }
    else{
    	x=top->data;
        p=top;
        top=top->next;
        delete p;
        size--;
        return true;
    }
}

CPP实现及应用

#include<iostream>
using namespace std;

template<class T>
class LinkStack;

template<class T>
class LinkNode{
	friend class LinkStack<T>;
	public:
		LinkNode(){
			next=NULL;
		}
	private:
		T data;
		LinkNode<T> *next;
};

template<class T>
class LinkStack{
	public:
		LinkStack();
		~LinkStack();
		bool IsEmpty() const;
		bool Push(const T& x);
		bool Top(T& x);
		bool Pop(T& x);
		void Output(ostream& out) const;
	private:
		LinkNode<T> *top;
		int size;
};

template<class T>
LinkStack<T>::LinkStack(){
	top=NULL;
	size=0;
}
template<class T>
LinkStack<T>::~LinkStack(){
	T x;
	while(top!=NULL){
		Pop(x);
	}
}
template<class T>
bool LinkStack<T>::IsEmpty() const{
	return top==NULL;
}
template<class T>
bool LinkStack<T>::Push(const T& x){
	LinkNode<T> *p=new LinkNode<T>;
	if(p==NULL){
		return false;
	}
	else{
		p->data=x;
		p->next=top;
		top=p;
		size++;
		return true;
	}
}
template<class T>
bool LinkStack<T>::Top(T& x){
	if(IsEmpty()){
		return false;
	}
	else{
		x=top->data;
		return true;
	}
}
template<class T>
bool LinkStack<T>::Pop(T& x){
	LinkNode<T> *p;
	if(IsEmpty()){
		return false;
	}
	else{
		x=top->data;
		p=top;
		top=top->next;
		delete p;
		size--;
		return true;
	}
}
template<class T>
void LinkStack<T>::Output(ostream& out) const{
	LinkNode<T> *p;
	p=top;
	for(int i=0;i<size;i++){
		out<<p->data<<endl;
		p=p->next;
	}
}
template<class T>
ostream& operator<<(ostream& out,LinkStack<T>& x){
	x.Output(out);
	return out;
}

void conversion(int,int);

int main(){
	cout<<"---------------将100转化为2进制表示-----------------"<<endl;
	conversion(100,2);
	cout<<endl;
	return 0;
}
void conversion(int n,int base){
	int x,y;
	y=n;
	LinkStack<int> s;
	while(y){
		s.Push(y%base);
		y=y/base;
	}
	cout<<"十进制数100转换为二进制数结果为:"<<endl;
	while(!s.IsEmpty()){
		s.Pop(x);
		cout<<x;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值