(1)栈的定义

栈(stack)是由有限个数据类型相同的有序元素所组成的集合,
对元素的操作只能在栈顶进行,
遵循后进先出(Last In,First Out)的原则,
其相关运算有创建空栈,判空,判满,入栈,出栈等. 

(2)栈的ADT

ADT Strack
数据:
有限个数据类型相同的有序元素所组成的集合,用top记录栈顶元素的位置.
运算:
	Create()        创建空栈
	IsEmpty()       判空:若栈空,则返回 1,否则 返回 0; 
	IsFull()		判满:若栈满,则返回 1,否则 返回 0;
	Push()			入栈
	Pop()			出栈
	Display() 		输出栈元素 

(3)栈的数组实现

定义数组data[MaxSize]用来存储栈元素,MaxSize是允许的最大容量,
用变量top记录栈顶元素的位置,top = -1表示空栈,这种栈称为顺序栈(sequence stack).
#include<iostream> 
using namespace std;
#define MaxSize 100
//顺序栈定义
struct SeqStack{
	int data[MaxSize];
	int top;
}; 

//创建空栈 
void Create(SeqStack &S){
	S.top = -1;
}
//判空
int IsEmpty(SeqStack S){
	if(S.top == -1) return 1;
	else return 0;
} 
//判满
int IsFull(SeqStack S){
	if(S.top == MaxSize-1) return 1;
	else return 0;
}
//入栈	
void Push(SeqStack &S,int x){
	if(IsFull(S)){
		cout<<"栈满,无法入栈"<<endl; 
		return; 
	}
	S.data[++S.top]=x;
}

//出栈
void Pop(SeqStack &S,int &x){
	if(IsEmpty(S)){
		cout<<"栈空,无法出栈"<<endl;
		return; 
	}
	x=S.data[S.top--]; 
}
//输出栈元素 	
void Display(SeqStack S){
	if(IsEmpty(S)){
		cout<<"栈空,无元素输出"<<endl;
		return; 
	}
	int i=S.top;
	while(i>=0)
		cout<<S.data[i--]<<" ";
	cout<<endl;	
} 

int main(){
	SeqStack S;
	Create(S);
	Push(S,1);
	Push(S,2);	
	Push(S,3);	
	cout<<"栈中元素:";Display(S);
	
	int x; 
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 	
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 
		
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 	
}

(4)栈的链表实现

利用链表长创建栈,称为链栈.链栈的优点是可以动态改变链表长度,不存在判别栈满的问题.
由于链栈应遵循后进先出的原则,创建链栈时,应采用 前插法来创建.
#include<iostream>
using namespace std;

struct Node{
	int data;
	Node *next;
}; 
//链栈定义 
struct LinkStack{
	Node *top;
}; 

//创建链栈
void Create(LinkStack &S){
	S.top=NULL;
}
//判空
int IsEmpty(LinkStack S){
	if(S.top==NULL) return 1;
	else return 0;
} 

//入栈
void Push(LinkStack &S,int x){
	Node *NewNode;
	NewNode=new Node;
	NewNode->data=x;
	NewNode->next=NULL;
	if(IsEmpty(S))
		S.top=NewNode;
	else{
		NewNode->next=S.top;
		S.top=NewNode;
	}	
} 

//出栈
void Pop(LinkStack &S,int &x){
	if(IsEmpty(S)){
		cout<<"栈空,无法出栈"<<endl;
		return; 
	}
	Node *p=S.top;
	if(p->next==NULL){
		x=p->data;
		S.top=NULL;
		delete p;
	}else{
		x=p->data;
		S.top=S.top->next;
		delete p;
	}
} 

//输出链栈 
void Display(LinkStack S){
	if(IsEmpty(S)){
		cout<<"栈空,无结点输出"<<endl;
		return; 
	} 
	Node *p=S.top;
	while(p!=NULL){
		cout<<p->data<<"=>";
		p=p->next;
	} 
	cout<<"NULL"<<endl;
}

int main(){
	LinkStack S;
	Create(S);
	Push(S,1);
	Push(S,2);	
	Push(S,3);	
	cout<<"栈中元素:";Display(S);
	
	int x; 
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 	
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 
		
	Pop(S,x);
	cout<<"出栈元素:"<<x<<endl;
	cout<<"栈中元素:";Display(S); 	
}

写于2020-10-22

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页