• 数据结构趣题——回文字符串的判定


    同时使用一个栈和一个队列

       1: #include "stdio.h"
       2: #define STACK_INIT_SIZE 20
       3: #define STACKINCREMENT 10
       4:  
       5:  
       6: typedef char ElemType;   /*将char类型定义为ElemType*/
       7:  
       8: typedef struct QNode {    /*定义队列结点类*/
       9:     ElemType data;
      10:     struct QNode *next;
      11: } QNode , *QueuePtr;
      12:  
      13: typedef struct {     /*定义一个链队列*/
      14:     QueuePtr front;   /*队头指针*/
      15:     QueuePtr rear;    /*队尾指针*/
      16: } LinkQueue;
      17:  
      18: typedef struct {       /*定义一个栈类型*/
      19:     ElemType *base;
      20:     ElemType *top;
      21:     int stacksize;
      22: } sqStack;
      23:  
      24:  
      25: void initQueue(LinkQueue *q) {
      26:     /*初始化一个空队列*/
      27:     q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); /*创建一个头结点,队头队尾指针                                                                指向该结点*/
      28:  
      29:     if( !q->front) exit(0);     /*创建头结点失败*/
      30:  
      31:     q->front->next = NULL;     /*头结点指针域置NULL*/
      32: }
      33:  
      34: void EnQueue(LinkQueue *q, ElemType e) {     /*入队列操作*/
      35:     QueuePtr p;
      36:     p = (QueuePtr)malloc(sizeof(QNode));  /*创建一个队列元素结点*/
      37:  
      38:     if( !q->front) exit(0);     /*创建头结点失败*/
      39:  
      40:     p->data = e;                /*将元素e入队列*/
      41:     p->next = NULL;             /*修改队尾指针*/
      42:     q->rear ->next = p;
      43:     q->rear = p;
      44: }
      45:  
      46: void DeQueue(LinkQueue *q, ElemType *e) {
      47:     /*如果队列q不为空,删除q的队头元素,用e返回其值*/
      48:     QueuePtr p;
      49:  
      50:     if(q->front == q->rear) return;  /*队列为空,返回*/
      51:  
      52:     p = q->front->next;
      53:     *e = p->data;
      54:     q->front->next = p->next;
      55:  
      56:     if(q->rear == p) q->rear = q->front;  /*如果队头就是队尾,则修改队尾指针*/
      57:  
      58:     free(p);
      59: }
      60:  
      61: void initStack(sqStack *s)
      62: {
      63:     /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
      64:     s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
      65:  
      66:     if(!s->base) exit(0);     /*分配空间失败*/
      67:  
      68:     s->top = s->base;       /*最开始,栈顶就是栈底*/
      69:     s->stacksize = STACK_INIT_SIZE;   /*最大容量为STACK_INIT_SIZE */
      70: }
      71:  
      72: void Push(sqStack *s, ElemType e) {       /*入栈操作*/
      73:     if(s->top - s->base >= s->stacksize) {
      74:         /*栈满,追加空间*/
      75:         s->base = (ElemType *)realloc(s->base, (s->stacksize +
      76:                                                 STACKINCREMENT) * sizeof(ElemType));
      77:  
      78:         if(!s->base) exit(0);   /*存储分配失败*/
      79:  
      80:         s->top = s->base + s->stacksize;
      81:         s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
      82:     }
      83:  
      84:     *(s->top) = e;  /*放入数据*/
      85:     s->top++;
      86: }
      87:  
      88: void Pop(sqStack *s , ElemType *e) {  /*出栈操作*/
      89:     if(s->top == s->base) return;  /*将栈顶元素弹出*/
      90:  
      91:     *e = *--(s->top);              /*修改栈顶指针*/
      92: }
      93:  
      94: int StackLen(sqStack s) {    /*获得栈s的大小*/
      95:     return (s.top - s.base) ;
      96: }
      97:  
      98:  
      99: int main()
     100: {
     101:     sqStack s;
     102:     LinkQueue q;
     103:     ElemType e, r1, r2;
     104:     int flag = 1, i, len;
     105:  
     106:     initQueue(&q);  /*初始化一个队列*/
     107:     initStack(&s);  /*初始化一个栈*/
     108:     printf("Please input a string ,type '@' for end\n");
     109:     scanf("%c", &e);
     110:  
     111:     while(e != '@') {      /*输入待判断的字符序列*/
     112:         Push(&s, e);
     113:         EnQueue(&q, e);
     114:         scanf("%c", &e);
     115:     }
     116:  
     117:     len =  StackLen(s) / 2; /*获得字符序列的长度*/
     118:  
     119:     for(i = 0; i < len; i++)
     120:     {
     121:         Pop(&s, &r1);    /*出栈操作,由r1将栈顶元素返回*/
     122:         DeQueue(&q, &r2); /*出队列操作,由r2将队头元素返回*/
     123:  
     124:         if(r1 != r2) {
     125:             flag = 0;
     126:             break;
     127:         }
     128:     }
     129:  
     130:     if(flag == 1)printf("It is a circle string.\n");
     131:     else printf("It is not a circle string.\n") ;
     132:  
     133:     return 0;
     134:  
     135: }
     136:  
  • 相关阅读:
    【C】C99与C89区别以及转换方法
    【bug】warning #13200: No emms instruction before return from function
    【linux/makefile】-D_REENTRANT编译选项的作用
    【arm】arm交叉编译工具链使用说明
    【Linux】linux中的strip命令
    【Linux】nm命令中符号类型详解
    【link】illegal text-relocation in IOS platform
    【link】IOS平台下汇编函数符号链接问题
    【ffmpeg】ffserver搭建流媒体服务
    【economic】程序员外包平台
  • 原文地址:https://www.cnblogs.com/steven_oyj/p/1746025.html
Copyright © 2020-2023  润新知