顺序栈的两种方式:
//法一:数组方式,最常用
#include<iostream>
using namespace std;
#define MAXSIZE 2 //const ElementType MAXSIZE=2;
typedef int ElementType;
struct SeqStack{
ElementType data[MAXSIZE];
int top;
};
//typedef struct node * SeqStack;//节点的结构体内没有出现指针,所以不能有指针
void CreateStack(SeqStack & S){ //栈发生改变,要&
S.top= -1;
}
bool IsEmpty(SeqStack S){ //判断栈是否为空
return (S.top == -1);
}
bool IsFull( SeqStack S ){ //判断栈满
return (S.top == MAXSIZE-1);
}
bool Push(SeqStack & S, ElementType x){ //栈发生改变,而入栈的元素本身不发生改变,所以前者要&,后者不要&
if ( IsFull( S ) ) return false; /*即S->top==MAXSIZE-1栈满不能入栈*/
else{
S.data[++S.top]=x;
return true;
}
}
ElementType Pop(SeqStack & S){
if ( IsEmpty( S ) ) return false; /*即S->top==-1栈空不能出栈,false就是0,0是 ElementType类型的 */
else return (S.data[(S.top)--]);
}
int main(){
SeqStack S;
CreateStack(S);
bool aa=IsEmpty(S);
cout<<aa<<endl; //1即true
Push(S,21);
Push(S,23);
bool bb=IsFull(S);
cout<<bb<<endl;//1即true
int x=Pop(S);
cout<<x<<endl;//23
int y=Pop(S);
cout<<y<<endl;//21
return 0;
}
//法二:指针方式
#include<iostream>
//#include<malloc.h> //c用malloc和free创建和删除节点,C++中用new和delete来创建
和删除节点
#define MAXSIZE 2 //const ElementType MAXSIZE=2;
using namespace std;
typedef int ElementType;
struct SeqStack{
ElementType * data; /* 存储元素的数组 */
int max; /* 堆栈最大容量 */
int top; /* 栈顶指针 */
};
SeqStack * CreateStack( int max){
SeqStack * S = new SeqStack;//(SeqStack) malloc (sizeof(struct node))
S->data = new ElementType;//(ElementType *)malloc(max * sizeof(ElementType))
S->top = -1;
S->max = max;
return S;
}
bool IsFull( SeqStack * S ){
return (S->top == S->max-1);
}
bool IsEmpty( SeqStack * S ){
return (S->top == -1);
}
bool Push( SeqStack * S, ElementType x){
if ( IsFull(S) ) return false; /*即S->Top == -1栈满不能入栈*/
else {
S->data[++(S->top)] = x;
return true;
}
}
ElementType Pop( SeqStack * S ){
if ( IsEmpty(S) ) return false; /*即S->Top == max-1栈满不能入栈,false就是0,0是 ElementType类型的*/
else return ( S->data[(S->top)--] );
}
int main(){
SeqStack * S;
S=CreateStack(MAXSIZE);
bool aa=IsEmpty(S);
cout<<aa<<endl; //1即true
Push(S,21);
Push(S,23);
bool bb=IsFull(S);
cout<<bb<<endl;//1即true
int x=Pop(S);
cout<<x<<endl;//23
int y=Pop(S);
cout<<y<<endl;//21
return 0;
}
链栈
//链栈即为:带空白头结点的单链表
#include<iostream>
//#include<malloc.h> //c用malloc和free创建和删除节点,C++中用new和delete来创建
using namespace std;
typedef int ElementType;
struct LinkStack{
ElementType data;
LinkStack * next;
};
LinkStack * CreateStack(){ /* 构建一个堆栈的空白头结点,返回该结点指针 */
LinkStack * S = new LinkStack;//(LinkStack *)malloc(sizeof(struct LinkStack))
S->next = NULL;
return S;
}
bool IsEmpty(LinkStack * S){ /* 判断堆栈S是否为空,若是返回true;否则返回false */
return ( S->next == NULL );
}
//链表不存在栈满的情况
bool Push(LinkStack * S, ElementType x){ /* 将元素X压入堆栈S */
LinkStack * tmp = new LinkStack;//(LinkStack *)malloc(sizeof(struct LinkStack))
tmp->data = x;
tmp->next=NULL;
//头插法
tmp->next = S->next;
S->next = tmp;
return true;
}
ElementType Pop(LinkStack * S){ /* 删除并返回堆栈S的栈顶元素 */
LinkStack * first;
ElementType x;
if( IsEmpty(S) ) return false; //false就是0,0是 ElementType类型的
else{
first = S->next;
x = first->data;
S->next = first->next;
delete(first);//free(first);
return x;
}
}
int main(){
LinkStack * S;
S=CreateStack();
bool aa=IsEmpty(S);
cout<<aa<<endl; //1即true
Push(S,21);
Push(S,23);
int x=Pop(S);
cout<<x<<endl;//23
int y=Pop(S);
cout<<y<<endl;//21
return 0;
}
顺序循环队列的两种方式
//法一:数组方式,最常用
#include<iostream>
//#include<malloc.h> //c用malloc和free创建和删除节点,C++中用new和delete来创建
using namespace std;
#define MAXSIZE 3
typedef int ElementType;
struct SeqQueue{
ElementType data[MAXSIZE]; /*存储元素的数组*/
int front,rear; /*队列的头、尾指针*/
int max; /*队列最大容量*/
};
void CreateQueue(SeqQueue & Q){
Q.front=Q.rear=0;
}
bool IsEmpty(SeqQueue Q){
return (Q.front==Q.rear);
}
bool IsFull(SeqQueue Q){
return ( (Q.rear+1) % MAXSIZE == Q.front );
}
bool Push(SeqQueue & Q,ElementType x){
if(IsFull(Q)){
return false;
}else{
Q.rear=(Q.rear+1) % MAXSIZE;//先移动指针
Q.data[Q.rear]=x;
return true;
}
}
ElementType Pop(SeqQueue & Q){
if(IsEmpty(Q)) return false;//false就是0,0是 ElementType类型的
else{
Q.front=(Q.front+1) % MAXSIZE;//先移动指针
return Q.data[Q.front];
}
}
int main(){
SeqQueue Q;
CreateQueue(Q);
bool aa=IsEmpty(Q);
cout<<aa<<endl; //1即true
Push(Q,21);
Push(Q,23);
bool bb=IsFull(Q);
cout<<bb<<endl;//1即true
int x=Pop(Q);
cout<<x<<endl;//21
int y=Pop(Q);
cout<<y<<endl;//23
return 0;
}
//法二:指针方式
#include<iostream>
//#include<malloc.h> //c用malloc和free创建和删除节点,C++中用new和delete来创建
using namespace std;
#define MAXSIZE 3
typedef int ElementType;
struct SeqQueue{
ElementType * data; /*存储元素的数组*/
int front,rear; /*队列的头、尾指针*/
int max; /*队列最大容量*/
};
SeqQueue * CreateQueue(int max){
SeqQueue * Q =new SeqQueue; //(SeqQueue *)malloc(sizeof(struct SeqQueue))
Q->data=new ElementType; //(ElementType *)malloc( max * sizeof(ElementType) )
Q->front=Q->rear=0;
Q->max=max;
return Q;
}
bool IsEmpty(SeqQueue * Q){
return (Q->front==Q->rear);
}
bool IsFull(SeqQueue * Q){
return ( (Q->rear+1) % Q->max == Q->front );
}
bool Push(SeqQueue * Q,ElementType x){
if(IsFull(Q)){
return false;
}else{
Q->rear=(Q->rear+1) % Q->max;//先移动指针
Q->data[Q->rear]=x;
return true;
}
}
ElementType Pop(SeqQueue * Q){
if(IsEmpty(Q)){
return false;//false就是0,0是 ElementType类型的
}else{
Q->front=(Q->front+1) % Q->max;//先移动指针
return Q->data[Q->front];
}
}
int main(){
SeqQueue * Q;
Q=CreateQueue(MAXSIZE);
bool aa=IsEmpty(Q);
cout<<aa<<endl; //1即true
Push(Q,21);
Push(Q,23);
bool bb=IsFull(Q);
cout<<bb<<endl;//1即true
int x=Pop(Q);
cout<<x<<endl;//21
int y=Pop(Q);
cout<<y<<endl;//23
return 0;
}
链队列
//链队列即为:带空白头结点的单链表,单链表实体节点部分设置一头一尾指针
#include<iostream>
//#include<malloc.h> //c用malloc和free创建和删除节点,C++中用new和delete来创建
using namespace std;
#define MAXSIZE 3
typedef int ElementType;
struct node{ //队列中的每个节点
ElementType data;
node * next;
};
struct LinkQueue{ //队列
node * front,* rear; /*队列的头、尾指针*/
};
LinkQueue * CreateQueue(){
LinkQueue * Q=new LinkQueue;//(LinkQueue *)malloc(sizeof(LinkQueue))
Q->front=Q->rear=NULL;
return Q;
}
bool IsEmpty(LinkQueue * Q){
return ( Q->rear == NULL); //也可以这么写:return ( (Q->front == NULL)
|| (Q->rear == NULL) );
}
//不存在队列满的情况
bool Push(LinkQueue * Q,ElementType x){
node * tmp= new node;//(node *)malloc(sizeof(node))
tmp->data=x;
tmp->next=NULL;
if( IsEmpty(Q) ){//队空,则新节点既是队首节点,也是队尾节点
Q->front=Q->rear=tmp;
}else{//队不空
Q->rear->next=tmp;
Q->rear=tmp;
}
return true;
}
ElementType Pop(LinkQueue * Q){
node * tmp;//
int x;
if(IsEmpty(Q)) return false;//false就是0,0是 ElementType类型的
else tmp=Q->front;
if(Q->front==Q->rear){//队列中只剩最后一个节点时
Q->front=Q->rear=NULL;
}else{
Q->front=Q->front->next;
}
x=tmp->data;
delete(tmp);//free(tmp);
return x;
}
int main(){
LinkQueue * Q;
Q=CreateQueue();
bool aa=IsEmpty(Q);
cout<<aa<<endl; //1即true
Push(Q,21);
Push(Q,23);
int x=Pop(Q);
cout<<x<<endl;//21
int y=Pop(Q);
cout<<y<<endl;//23
return 0;
}