使用链表结构构建栈结构

在所熟悉的栈结构和队列结构中,使用数组存储数据的方式非常简单,但一旦在插入和删除操作时就会显得很吃力了,而使用链表结构,虽然会导致后面或者前面的数据位子发生变动,却显得花费轻松了很多,所以学习链表结构就显得尤为的重要,而对应关系也是的链表结构成为了大多程序员愿意选择的一种方式。链表结构有两种,一种是静态的,说的是确定了链表长,往里面添加数据就可以了,可能要求考虑满的情况,不利于数据的动态添加和维护。使用动态结构,非常灵活,是我最想也是最愿意使用的方式:

下面是使用链表结构构建的 栈数据结构代码(读者可以细心的阅读代码注释,不清楚的可以发言,收到后即回):

//超超
//2016 10 6
#include<iostream>
using namespace std;
enum error_code{success,overflow,underflow,rang_error};
typedef int elementtype;
typedef struct linknode{
elementtype data;//链表结点存放的数据
struct linknode *next;//指向后继结点
}node;
//使用链表结构 构建  栈数据结构  链栈
class link_stack{
public:
link_stack();
~link_stack();
bool isempty() const;
bool isfull() const;//链表结构动态,满不满不需要考虑,除非达到了使用的最大的内存空间
error_code get_top(elementtype &x) const;//取栈顶元素
error_code push(const elementtype x);//入栈
error_code pop();//出栈
private:
//要注意到我们使用的是动态的链表,所以一般不指定链表的长度
int count;//计数器
//链表结构是通过指针来连接的
node *top; //作为栈顶指针
};
int main(){
void write_read();
write_read();
return 1;
}
link_stack::link_stack(){
count=0;
top=NULL;
}
//注意析构函数使用出栈,没有有返回值
link_stack::~link_stack(){
while(!isempty()) pop();
}
bool link_stack::isempty() const{
if(count==0) return true;
else return false;
//上面两行代码可以用下面的替代
//return count==0;
}
//链表结构取栈顶的时候,只要取栈顶指针指向的那个data即可
error_code link_stack::get_top(elementtype &x) const{
if(isempty()) return underflow;
else{
x=top->data;
return success;
}
}
/*链表结构入栈,注意是对栈顶指针做向前的添加,而不是做向后的添加
 这样才符合栈结构的特点*/
error_code link_stack::push(const elementtype x){
//为了添加新的元素,我们必须要一个新的结点指针指向这个新的数据data
node *s=new node;
s->data=x;
//这时候只要将这个元素的结点指向之前的top指针所指结点,再让top回调指向他本身即可
s->next=top;
top=s;
count++;
return success;
}
/*链表结构出栈,注意是对栈顶指针做删除的操作,直到为空
  在这样一个过程中,要注意的是指针跳向下一指针的过程中,指针应该要得到释放
  不然就是浪费资源空间,这不是我们想要的,delete*/
error_code link_stack::pop(){
if(isempty()) return underflow;
else{
node *u;
u=top;//让u先保存要删除的栈顶指针
top=top->next;//将栈顶指向的删除
delete u;//释放空间,完成删除
count--;
return success;
}
}
//使用链栈存取数据
void write_read(){
link_stack ls;
elementtype x;
int i;
cout<<"请输入你要保存的数据个数:"<<endl;
cin>>i;
for(int j=1;j<=i;j++){
cout<<"请输入第"<<j<<"个数:"<<" ";
cin>>x;
ls.push(x);
}
cout<<"链栈结构中保存的元素顺序为:"<<endl;
while(!ls.isempty()){
ls.get_top(x);
cout<<x<<" ";
ls.pop();
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值