栈和队列

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; }

 

posted @ 2014-03-26 14:59  zhoudan  阅读(121)  评论(0)    收藏  举报