栈和队列
Stack.h文件
#ifndef STACK_H
#define STACK_H
#define MAXSIZE 100
enum Status {error,ture};
typedef char ElemType;
typedef struct LinkNode { ElemType elem; struct LinkNode *next; }LNode;
typedef struct { LNode *tail;//栈顶指针 }LinkStack;
void Init(LinkStack &S);
void CreatStack(LinkStack &S,int n);
void DestroyStack(LinkStack &S);
void push(LinkStack &S,ElemType elem);
void pop(LinkStack &S);
ElemType GetElem(LinkStack S);
int EmptyStack(LinkStack S);
//下面实现队列
typedef struct QueneNode { ElemType elem; struct QueneNode *next; }QNode;
typedef struct { QNode *front; //队头指针 QNode *rear; //队尾指针 }LinkQuene;
Status InitQ(LinkQuene &Q);
Status CreateQ(LinkQuene &Q,int n);
Status EnterQ(LinkQuene &Q,ElemType elem);
Status DeleteQ(LinkQuene &Q);
Status DestoryQ(LinkQuene &Q);
ElemType GetQ(LinkQuene Q);
Status EmptyQ(LinkQuene Q);
void disp(LinkQuene Q);
#endif STACK_H
Stack.cpp文件
#include"Stack.h" #include<stdlib.h> //动态分配存储空间,即调用malloc,realloc #include<iostream> using namespace std; //顺序栈 /*void Init(SqStack &S) { S.elem=new ElemType[MAXSIZE]; S.length=0; } void CreatStack(SqStack &S,int n) { Init(S); for(int i=0;i<n;i++) { cin>>S.elem[i]; S.length++; }
} void push(SqStack &S,ElemType elem) { if(S.length==MAXSIZE) { cout<<"Stack overflow!"<<endl; exit (0); } S.elem[S.length++]=elem; } void pop(SqStack &S) { if(S.length==0) { cout<<"Stack is empty!"<<endl; exit (0); } //elem=S.elem[--S.length]; --S.length;
} ElemType GetElem(SqStack &S) { if(S.length==0) { cout<<"Stack is empty!"<<endl; exit (0); } return S.elem[S.length-1]; } int EmptyStack(SqStack S) { if(S.length==0) return 1; else return 0; } */ //链式栈 void Init(LinkStack &S) { S.tail=(LNode *)malloc(sizeof(LNode)); if(!S.tail) exit (0); S.tail->next=NULL;
} void CreatStack(LinkStack &S,int n) { Init(S); LNode *p; for(int i=0;i<n;i++) { p=(LNode *)malloc(sizeof(LNode)); cin>>p->elem; p->next=S.tail; //将指针链接在栈上 S.tail=p; //栈顶指针后移 }
}
void DestroyStack(LinkStack &S) //tail是一个指针,代表每个栈的栈顶, { //不管是顺序还是链式的,都只能在栈顶操作元素 LNode *p; p=S.tail; if(p) { S.tail=S.tail->next; free(p); p=S.tail; }
} void push(LinkStack &S,ElemType elem) { LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) exit (0); p->elem=elem; p->next=S.tail; //将节点链入栈中 S.tail=p; //将栈顶指针向上移 } void pop(LinkStack &S) { if(!(S.tail->next)) exit(0); LNode *p; p=S.tail; S.tail=S.tail->next; free(p); } ElemType GetElem(LinkStack S) { if(!(S.tail->next)) exit (0); ElemType elem; elem=S.tail->elem; return elem; } int EmptyStack(LinkStack S) { if(!(S.tail->next)) return 1; else return 0; } /**************************以下是对队列的实现****************************/ Status InitQ(LinkQuene &Q) { QNode *p; p=(QNode *)malloc(sizeof(QNode)); if(!p) return error; Q.front=Q.rear=p; Q.front->next=NULL; //对头指针指向空,即没有后继,说明队列为空 return ture; } Status CreateQ(LinkQuene &Q,int n) { QNode *p; for(int i=0;i<n;i++) { p=(QNode *)malloc(sizeof(QNode)); if(!p) return error; cin>>p->elem; p->next=NULL; //对于队列,入队时加入队尾 Q.rear->next=p; //出队时,是从队头开始出的,这一点跟栈的差别是很大的 Q.rear=p; //入队后,队尾指针后移 } } Status EnterQ(LinkQuene &Q,ElemType elem) //入队时操作的是对尾 { QNode *p; p=(QNode *)malloc(sizeof(QNode)); if(!p) return error; p->elem=elem; p->next=NULL; Q.rear->next=p; Q.rear=p; return ture; } Status DeleteQ(LinkQuene &Q) //出队要讨论出队后会不会导致该队列成为空队 { if(Q.front==Q.rear) return error; QNode *p; p=Q.front->next; //这里是因为有头指针的缘故,头指针中没有数据元素, Q.front->next=p->next; // 但是又不可缺少,有头指针之后,许多操作都会很方便 if(Q.rear==p) Q.rear=Q.front; //若此时为队列中的最后一个元素,则必须讨论 free(p); } Status DestoryQ(LinkQuene &Q) { while(Q.front) //如果队列非空,此处是销毁队列,所以可以借助队尾指针, { //无需再定义指针 Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } return ture; } ElemType GetQ(LinkQuene Q) { if(!(Q.front->next)) exit (0); ElemType elem; elem=Q.front->next->elem; return elem; } Status EmptyQ(LinkQuene Q) { if(!Q.front->next) return ture; else return error; } void disp(LinkQuene Q) { QNode *p=Q.front->next; while(p) { cout<<p->elem<<" "; p=p->next; } cout<<endl; }
浙公网安备 33010602011771号