数据结构-栈和队列——20150602

//顺序栈定义及实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数结果状态代码
#define  TRUE                 1
#define  FALSE                0
#define   OK                  1
#define  ERROR                0
#define  INFEASIBLE           -1
#define  OVERFLOW             -2
#define  STACK_INIT_SIZE      100
#define  STACKINCREMENT       10


typedef int Status;
typedef char SElemType;
typedef struct {
			SElemType*base;
			SElemType*top;
			int stacksize;
}Stack;
void CopySElemType(SElemType&s,SElemType e)
{
      s=e;
}
Status InitStack(Stack &S)
{
      //建立一个空栈;
      S.base=(SElemType*)malloc(sizeof(SElemType));
      if(!S.base)exit(OVERFLOW);
      S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}
Status DestroyStack(Stack&S)
{
      free(S.base);S.top=NULL;S.base=NULL;S.stacksize=0;return OK;
}
void ClearStack(Stack&S)
{
      S.top=S.base;S.stacksize=STACK_INIT_SIZE;
}
Status EmptyStack(Stack S)
{
      if(S.top-S.base)return FALSE;
      return OK;
}
Status Push(Stack &S,SElemType e)
{
      if(S.top-S.base==S.stacksize)
      {
            Stack SS;SS.top=(SElemType*)realloc(S.base,sizeof(S.stacksize+STACKINCREMENT));
            if(!SS.base)exit(OVERFLOW);
            free(S.base);S.base=SS.base;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;
      }
      CopySElemType(*S.top,e);S.top++;return OK;
}
Status Pop(Stack &S,SElemType &e)
{
      if(S.top==S.base)return ERROR;
      CopySElemType(e,*(S.top-1));--S.top;
      return OK;
}
Status GetTop(Stack S,SElemType&e)
{
      if(S.top==S.base)return FALSE;
      CopySElemType(e,*(S.top-1));return OK;
}
Status SetTop(Stack&S,SElemType e)
{
      if(EmptyStack(S))return FALSE;
      CopySElemType(*(S.top-1),e);return OK;
}





对于链式栈可以用如下的定义方式
 typedef struct SNode{  
      SElemType data;
      struct SNode *next;
 }SNode, *LinkStack;
具体实现,以后有时间再加!

2、队列
概念: 队列类似线性表和栈,也是定义在线性结构上的ADT,与线性表和栈的区别在于,元素的插入和删除分别在表的两端进行。
类似日常生活中排队,允许插入的一端为队尾(rear),允许删除端称队头(front)
特性:First In First Out先进先出,如操作系统中的作业队列和打印任务队列、日常生活中各类排队业务等均可用队列模拟
队列一般也有两种存储形式,链式队列和顺序队列(循环队列),这里我只写了链式队列的,另一种以后补充。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"stack_sq.h"


#define  TRUE                 1
#define  FALSE                0
#define   OK                  1
#define  ERROR                0
#define  INFEASIBLE           -1
#define  OVERFLOW             -2


typedef int Status;
typedef char QElemType;
typedef struct QNode{
      QElemType data;
      struct QNode*next;
}QNode,*QueuePtr;
typedef struct{
      QueuePtr front;
      QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue&Q)
{
      Q.front=(QNode*)malloc(sizeof(QNode));
      if(!Q.front)exit(OVERFLOW);
      Q.rear=Q.front;Q.front->next=NULL;
      return OK;
}
Status DestroyQueue(LinkQueue&Q)
{
      QNode*p=Q.front->next;
      while(p)
      {
            Q.front->next=p->next;free(p);
            p=Q.front->next;
      }
      free(Q.front );Q.front=Q.rear=NULL;
      return OK;
}
Status ClearQueue(LinkQueue&Q)
{
      QueuePtr p=Q.front->next;
      while(p)
      {
            Q.front->next=p->next;
            free(p);p=Q.front->next;
      }
      Q.rear=Q.front;return OK;
}
Status EnQueue(LinkQueue&Q,QElemType e)
{
      QueuePtr p;p=(QNode*)malloc(sizeof(QNode));
      if(!p)exit(OVERFLOW);
      p->next=NULL;p->data=e;
      Q.rear->next=p;Q.rear=p;return OK;
}
Status DeQueue(LinkQueue&Q,QElemType&e)
{
      if(Q.rear==Q.front)return FALSE;
      QueuePtr p=Q.front->next;e=p->data;
      Q.front->next=p->next;
      if(p==Q.rear)Q.rear=Q.front;
      return OK;
}


下面是学习的时候做过的一个判断是不是回文的代码,一起附上吧。
#include"queue_L.h"


Status HuiWen(QElemType *p)
{
      LinkQueue Q;Stack S;SElemType se;QElemType qe;
      if(InitQueue(Q));if(InitStack(S));
      while(*p!='@'&&*p!='\n')
      {
            if(EnQueue(Q,*p));if(Push(S,*p));++p;
      }
      while(Pop(S,se)&&DeQueue(Q,qe))
      {
            if(se!=qe){printf("不是回文。");return FALSE;}
      }
      printf("是回文。");return OK;
}
int main()
{
      char s[100]="3445abaaba5443@";
      if(HuiWen(s));
      return 0;
}

ps:虽然简单,但也是我当年一个一个代码敲上去的,还望各位用心指教。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值