数据结构与算法习题汇总(3)
2016-04-13 22:04
579 查看
Q:判断一字符串是否为回文
A:对于这种要求输入和输出相反的情况,一般采用栈来解决,对于此题,只需将正序的字符串压栈再将其全部弹出栈,判断是否相同即可,代码如下:
Q:借助栈,将单链表逆置
A:再次强调对于要求输入输出相反的题目,首先考虑用栈解决,将链表中所有元素压栈,再弹出栈即可,代码如下:
Q;实现双栈共享空间的出入栈算法
A:见拙作《双栈共用存储空间》,不再赘述
A:对于这种要求输入和输出相反的情况,一般采用栈来解决,对于此题,只需将正序的字符串压栈再将其全部弹出栈,判断是否相同即可,代码如下:
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 typedef int status; typedef char elemtype; typedef struct stack{ elemtype ch[MAXSIZE]; int top; }stack; status visit(elemtype c){ printf("%c ",c); } status initstack(stack *S){ S->top=-1; } status stacklength(stack *S){ return S->top+1; } status push(stack *S,elemtype data){ S->top++; S->ch[S->top]=data; } status pop(stack *S,elemtype data){ data=S->ch[S->top]; S->top--; } status createstack(stack *S,elemtype start,elemtype end){ int i=0; for(i=start;i<end;i++){ S->top++; S->ch[S->top]=i; } } status createstack2(stack *S,elemtype data){ S->top++; S->ch[S->top]=data; } status traversestack(stack *S){ for(int i=S->top;i>=0;i--){ visit(S->ch[i]); } printf("\n"); } status inversestack(stack *S,stack *S1){ for(int i=S->top;i>=0;i--){ if(S->ch[i]!=S1->ch[i]) return FALSE; return TRUE; } } int main(void){ stack S,S1; initstack(&S); initstack(&S1); createstack(&S,'a','z'); for(char i='z';i>='a';i--){ push(&S,i); } traversestack(&S); for(int i=S.top;i>=0;i--){ push(&S1,S.ch[i]); } traversestack(&S); if(inversestack(&S,&S1)) printf("回文\n"); else printf("不是回文\n"); }
Q:借助栈,将单链表逆置
A:再次强调对于要求输入输出相反的题目,首先考虑用栈解决,将链表中所有元素压栈,再弹出栈即可,代码如下:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 #define maxsize 40 typedef int status; typedef int elemtype; //创建链表 struct node { elemtype data; struct node *next; }node; typedef struct sqstack{ elemtype data[maxsize]; elemtype top; }sqstack; typedef struct node *linklist; status visit(elemtype c) { printf("%d ",c); return OK; } //初始化链表 status initlist(linklist *l) { (*l)=(linklist)malloc(sizeof(node)); if(!(*l)) return ERROR; (*l)->next=NULL; return OK; } //尾插法 status createlisttail(linklist *l,int n) { linklist p=*l,q; int i; srand(time(0)); for(i=0;i<n;i++) { q=(linklist)malloc(sizeof(node)); q->data=rand()%100; p->next=q; p=q; } p->next=NULL; return OK; } status traverselist(linklist l) { linklist p=l->next; while(p) { visit(p->data); p=p->next; } printf("\n"); } //将元素压入栈 status push(sqstack *s,elemtype data) { if(s->top==maxsize-1){ return ERROR;//判断栈是否已满 } else{ s->top++; s->data[s->top]=data; } return OK; } //出栈并返回元素值 status pop(sqstack *s){ if(s->top==-1){ return ERROR; } else{ elemtype e; e=s->data[s->top]; printf("%d ",e); s->top--; } return OK; } status traversestack(sqstack *s){ int i=0; for(i=s->top;i>=0;i--){ printf("%d ",s->data[i]); } printf("\n"); } int main(void){ linklist l; sqstack S; initlist(&l); int num; scanf("%d",&num); createlisttail(&l,num); printf("整体创建l的元素(尾插法)\n"); traverselist(l); linklist pmove=l->next; while(pmove){ push(&S,pmove->data); pmove=pmove->next; } for(int i=0;i<num;i++){ pop(&S); } }
Q;实现双栈共享空间的出入栈算法
A:见拙作《双栈共用存储空间》,不再赘述
相关文章推荐
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之二叉树四:还原二叉树
- Huffman树的简单实现
- 数据结构中八大排序算法
- 用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构
- 用于并行计算的多线程数据结构,第 1 部分: 设计并发数据结构
- 栈的数组表示
- 从键盘读入n个整数(升序),请编写算法实现: 建立带表头结点的单链表; 显示单链表,(形如:H->10->20->30->40); 在有序单链表中插入新的数据元素x; 将单链表就地逆
- C语言实现的数据结构之------哈希表
- LRU Cache数据结构
- Java数据结构——哈希表
- YTUOJ之逆序输出单词(串)
- HDU 4411最小费用流
- 考研中的算法时间复杂度求解
- java中的数据结构
- 数据结构图的运算(深度优先)
- 数据结构与算法-第12章二叉树和其他树-001遍历集合的所有子集
- linux内核数据结构之kfifo(实现)
- 数据结构(java)——栈及其应用
- ThreadLocal