栈和队列判断回文数

  1. #include
  2. #include
  3. typedef char elemtype;
  4. #define SMaxSize 20//顺序栈初始分配单元个数
  5. typedef struct // 顺序栈结构定义
  6. {
  7.     elemtype *list;
  8.     int top;
  9.  
  10.  
  11. }SeqStack;
  12. typedef struct QNode//队列中结点定义
  13. {
  14. elemtype data;
  15. struct QNode *next;
  16. }QNode,*QueuePtr;
  17. typedef struct //队列定义
  18. {
  19.     QueuePtr front,rear;
  20.  
  21.  
  22. }LinkQueue;
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. void main()//补全横线上的内容
  30. {
  31. SeqStack* Init_Stack();//初始化顺序栈
  32. void Push(SeqStack *S,char e);//入栈操作
  33. void Pop(SeqStack *C,char *e);//出栈操作
  34. void Destroy_Stack(SeqStack *S);//销毁顺序栈
  35. LinkQueue* Init_Queue();//初始化链队列
  36. void EnQueue(LinkQueue *Q,char e);//入队列操作
  37. int DeQueue(LinkQueue *Q,char *e);//出队列操作
  38. void Destroy_Queue(LinkQueue *Q);//销毁链队列
  39.  
  40.  
  41. SeqStack *S1;
  42. char cs,cq,cc;//分别顺序栈实参元素,链队列实参元素及从键盘输入数据
  43. int t=1;//用于判断回文的标志,为1表示是回文
  44. LinkQueue *Q1;
  45. S1=Init_Stack();
  46. Q1=Init_Queue();
  47. printf("\n请输入字符序列,以回车结束\n");
  48. while ((cc=getchar())!='\n')//输入数据入栈和入队列
  49. {
  50. Push(S1,cc);//入栈
  51. EnQueue(Q1,cc);
  52. }
  53. while(S1->top!=-1)//元素出栈、出队,进行比较,若不同,则不是回文数
  54. {
  55. Pop(S1,&cs);
  56. DeQueue(Q1,&cq);
  57. if (cs!=cq){t=-1;break;}
  58. }
  59. if (t==1) printf("此序列是回文");
  60. else printf("此序列不是回文");
  61. Destroy_Stack(S1);
  62. Destroy_Queue(Q1);
  63. }
  64. //以下为各函数的定义
  65. SeqStack* Init_Stack()//初始化顺序栈,补全横线上的内容
  66. {
  67.     SeqStack *S;
  68.     S=(SeqStack *)malloc(sizeof(SeqStack));
  69.     if(!S){printf("栈内存分配失败\n");exit(1);}
  70. S->list=(char*)malloc(sizeof(char)*SMaxSize);    //修改
  71. if (S->list==NULL){printf("本次分配没有成功,程序结束");exit(1);}
  72. S->top=-1;
  73. return S;
  74. }
  75. void Push(SeqStack *S,char e)//入栈操作,补全横线上的内容
  76. {
  77. int i=0;
  78. if (S->top>=SMaxSize-1)
  79. {
  80. printf("上次分配空间已用完,重新分配空间\n");
  81. SeqStack p;
  82. p.list=malloc(sizeof(elemtype[2*SMaxSize]));     //修改
  83. if (p.list==NULL){printf("本次分配没有成功,本次操作无法完成");return;}
  84.         //将上次的空间数据移动到本空间来
  85.         for(i=0;i<=S->top-1;i++) p.list[i]=S->list[i];
  86.         free(S->list);
  87. //delete []S->list;
  88. S->list=p.list;
  89.  
  90.  
  91. }
  92.     S->top++;
  93.     S->list[S->top]=e;
  94.  
  95.  
  96.     return;
  97. }
  98. void Pop(SeqStack *C,char *e)//出栈操作,补全横线上的内容
  99. {
  100. if (C->top==-1) {printf("栈已空,不能继续执行出栈操作");return; }
  101. *e=C->list[C->top];
  102. C->top--;
  103. }
  104. void Destroy_Stack(SeqStack *S)//销毁顺序栈
  105. {
  106.     free(S->list);
  107. S->top=-1;
  108. }
  109. LinkQueue* Init_Queue()//初始化队列(带头结点),补全横线上的内容
  110. {
  111.     LinkQueue *Q=(LinkQueue *)malloc(sizeof(LinkQueue));
  112.     if(!Q){printf("申请内存失败\n");return 0;}
  113. QNode *s;
  114. s=malloc(sizeof(QNode));
  115. s->next=NULL;
  116. Q->front=s;
  117. Q->rear=s;
  118. return Q;
  119. }
  120. void EnQueue(LinkQueue *Q,char e)//入队列操作,补全横线上的内容
  121. {
  122. QNode *s,*p,*q;
  123. q=Q->rear;
  124.     s=malloc(sizeof(QNode));
  125. s->data=e;
  126. s->next=NULL;
  127. q->next=s;
  128. Q->rear=s;
  129. }
  130. int DeQueue(LinkQueue *Q,char *e)//出队操作,补全横线上的内容
  131. {
  132. QNode *s;
  133. if(Q->front==Q->rear)
  134.     return -1;
  135. s=Q->front->next;
  136. *e=s->data;
  137. Q->front->next=s->next;
  138. if(Q->rear==s)
  139.     Q->rear=Q->front;//如果只有一个节点,那么删除这个节点后rear指针也就丢了,需重新赋值
  140.     free(s);
  141. return 1;
  142. }
  143. void Destroy_Queue(LinkQueue *Q)//销毁队列
  144. {
  145. QNode *p,*q;
  146. p=Q->front;
  147. while (p!=NULL)
  148. {
  149. q=p;
  150.         p=p->next;
  151. free(q);
  152. }
  153. free(Q);
  154. }

你可能感兴趣的:(汇编语言)