因为c++中已经有了#include<stack>了,一般的数据类型已经可以满足了,但是有时候会用栈来存储自定义的结构体,这个就不行了,所以,需要自己写一个栈,并实现一些基本操作
分析:
顺序栈结构体:
typedef struct stack{
struct Node *n[100];
int top;
int base;
}Stack;
初始化栈:
Stack s;
void Init_stack(){
s.top=0;
s.base=0;
}
进栈:
void push_stack(Node *&p){ //进栈
s.n[++s.top]=p;
}
出栈:
Node* pop_stack(){ //出栈
return s.n[s.top--];
}
栈的大小:
int get_size(){
return s.top;
}
判断栈是否为空:
int empty_stack(){ //判断栈是否为空
if(s.base==s.top){
return 1;
}else{
return 0;
}
}
得到栈顶元素:
Node* get_top(){ //得到栈顶元素
return s.n[s.top];
}
完整代码:
#include <iostream>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
};
typedef struct stack{
struct Node *n[100];
int top;
int base;
}Stack;
Stack s;
void Init_stack(){
s.top=0;
s.base=0;
}
void push_stack(Node *&p){ //进栈
s.n[++s.top]=p;
}
Node* pop_stack(){ //出栈
return s.n[s.top--];
}
int empty_stack(){ //判断栈是否为空
if(s.base==s.top){
return 1;
}else{
return 0;
}
}
Node* get_top(){ //得到栈顶元素
return s.n[s.top];
}
int get_size(){
return s.top;
}
void Init_Node(Node *&p){
Node *l=p;
l->next=NULL;//定义头结点
}
void create_Node(Node *&p){
Node *s,*l=p;
int m;
while(1){
cin>>m;
if(m==-1){
break;
}
s=new Node;
s->data=m;
l->next=s;
l=s;
}
l->next=NULL;
}
int main()
{
Node *p=new Node;
//初始化测试链表
Init_Node(p);
cout<<"创建测试链表,输入-1结束:"<<endl;
//创建测试链表
create_Node(p);
cout<<"初始化顺序栈"<<endl;
//初始化顺序栈
Init_stack();
Node *p1=p->next;
cout<<"测试数据进入顺序栈"<<endl;
while(p1!=NULL){
cout<<p1->data<<" ";
//测试链表中的数据进顺序栈
push_stack(p1);
p1=p1->next;
}
cout<<endl;
cout<<"得到栈顶元素:"<<get_top()->data<<endl;
cout<<"栈的长度:"<<get_size()<<endl;
cout<<"出栈:";
while(!empty_stack()){
Node *s=pop_stack();
cout<<s->data<<" ";
}
cout<<endl;
cout<<"栈的长度:"<<get_size()<<endl;
return 0;
}
测试结果: