《数据结构教程》(李春葆 主编)课后习题【练习题3】
【3.2.2】
1 #include <iostream>
2 using namespace std;
3 int islegal(char s[])
4 {
5 int i,pushnum = 0,popnum = 0;
6 for(i=0;s[i];i++){
7 switch(s[i]){
8 case 'I': //入栈操作
9 pushnum++;break;
10 case 'O': //出栈操作
11 popnum++;break;
12 default:break;
13 }
14 if(pushnum<popnum)
15 return 0;
16 }
17 if(pushnum!=popnum)
18 return 0;
19 return 1;
20 }
21 int main()
22 {
23 char s[100];
24 while(cin>>s){
25 if(islegal(s))
26 cout<<"Yes"<<endl;
27 else
28 cout<<"No"<<endl;
29 }
30 return 0;
31 }
【3.3】
1 #include <stdio.h>
2 #include <malloc.h>
3 #define MaxSize 1000
4 typedef struct {
5 char data[MaxSize];
6 int top;
7 } SqStack;
8 void InitStack(SqStack* &s) //初始化
9 {
10 s = (SqStack*)malloc(sizeof(SqStack));
11 s->top = -1;
12 }
13 bool push(SqStack* &s,char e) //入栈
14 {
15 if(s->top==MaxSize-1) //现在已经满了
16 return false;
17 s->top++;
18 s->data[s->top] = e;
19 return true;
20 }
21 bool pop(SqStack* &s,char &e) //出栈
22 {
23 if(s->top==-1) //现在栈已经空了
24 return false;
25 e = s->data[s->top];
26 s->top--;
27 return true;
28 }
29 bool ispair(char s[])
30 {
31 int i;
32 char t;
33 SqStack* q;
34 InitStack(q); //初始化栈
35 for(i=0;s[i];i++){ //遇到前括号入栈,遇到后括号出栈比较
36 switch(s[i]){
37 case '(':
38 if(!push(q,'('))
39 return false;
40 break;
41 case '[':
42 if(!push(q,'['))
43 return false;
44 break;
45 case '{':
46 if(!push(q,'{'))
47 return false;
48 break;
49 case ')':
50 if(!pop(q,t))
51 return false;
52 if(t!='(')
53 return false;
54 break;
55 case ']':
56 if(!pop(q,t))
57 return false;
58 if(t!='[')
59 return false;
60 break;
61 case '}':
62 if(!pop(q,t))
63 return false;
64 if(t!='{')
65 return false;
66 break;
67 default:break;
68 }
69 }
70 if(q->top!=-1)
71 return false;
72 return true;
73 }
74 int main()
75 {
76 char a[MaxSize];
77 while(scanf("%s",a)!=EOF){
78 if(ispair(a))
79 printf("Yes\n");
80 else
81 printf("No\n");
82 }
83 return 0;
84 }
【3.5】
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MaxSize 4
4 typedef struct {
5 char data[MaxSize];
6 int front,rear;
7 }SqQueue;
8 void Init(SqQueue* &q) //队列初始化
9 {
10 q = (SqQueue*)malloc(sizeof(SqQueue));
11 q->front = q->rear = 0;
12 }
13 void push(SqQueue* &q,char e) //入队列操作
14 {
15 if((q->rear+1)%MaxSize==q->front){
16 printf("循环队列已满!\n");
17 return ;
18 }
19 q->rear = (q->rear+1)%MaxSize;
20 q->data[q->rear] = e;
21 }
22 void pop(SqQueue* &q) //出队列操作
23 {
24 if(q->rear==q->front){
25 printf("循环队列已空!\n");
26 return ;
27 }
28 q->front = (q->front+1)%MaxSize;
29 }
30 void print(const SqQueue* &q) //输出队列
31 {
32 int i;
33 for(i=(q->front+1)%MaxSize;(i-1+MaxSize)%MaxSize!=q->rear;i=(i+1)%MaxSize)
34 printf("%c ",q->data[i]);
35 printf("\n");
36 }
37 void invert(SqQueue* &q) //逆置循环队列
38 {
39 if(q->front > q->rear){ //如果队列跨越了0
40 int i=MaxSize-1,j=q->rear;
41 for(;i>q->front;i--){ //将0之前的部分放到逆置后的位置
42 char t;
43 ++j;
44 t=q->data[i];q->data[i]=q->data[j];q->data[j]=t;
45 }
46 j = q->rear;
47 for(i=0;i<j;i++){ //将0之后的部分逆置
48 char t;
49 t=q->data[i];q->data[i]=q->data[j];q->data[j]=t;
50 j--;
51 }
52 q->rear = (q->rear-q->front+MaxSize-1)%MaxSize;
53 q->front = MaxSize-1;
54 }
55 else{ //队列在0之后
56 int i=q->front+1,j=q->rear;
57 for(;i<j;i++){ //原地逆置
58 char t;
59 t=q->data[i];q->data[i]=q->data[j];q->data[j]=t;
60 j--;
61 }
62 j=0;
63 for(i=q->front+1;i<=q->rear;i++) //前移
64 q->data[j++] = q->data[i];
65 j--;
66 q->rear = j;
67 q->front = MaxSize-1;
68 }
69 }
70 int Menu()
71 {
72 int in;
73 printf("[1] 入队列操作\n");
74 printf("[2] 出队列操作\n");
75 printf("[3] 输出队列\n");
76 printf("[4] 逆置循环队列\n");
77 printf("[0] 按其他键退出\n");
78 scanf("%d",&in);
79 return in;
80 }
81 void Work(SqQueue* &q,int in)
82 {
83 char e;
84 switch(in){
85 case 1:
86 printf("你要输入的元素值:\n");
87 getchar();
88 scanf("%c",&e);
89 push(q,e);
90 break;
91 case 2:
92 pop(q);
93 break;
94 case 3:
95 printf("队列内容:\n");
96 print(q);
97 break;
98 case 4:
99 invert(q);
100 printf("队列逆置结束\n");
101 break;
102 default:
103 exit(1);
104 }
105 system("pause");
106 system("cls");
107 }
108 int main()
109 {
110 //循环队列初始化
111 SqQueue* q;
112 Init(q);
113 //菜单
114 while(1){
115 int in = Menu();
116 Work(q,in);
117 }
118 return 0;
119 }
【3.6】
1 #include <stdio.h>
2 #include <malloc.h>
3 #define MaxSize 1000
4 typedef struct SqQueue{
5 int data[MaxSize];
6 int front,rear;
7 SqQueue* next;
8 }SqQueue;
9 void Init(SqQueue &q) //队列初始化
10 {
11 q.front = -1;
12 q.rear = -1;
13 q.next = NULL;
14 }
15 bool QueueEmpty(SqQueue q) //判断队列是否为空
16 {
17 if(q.front == q.rear)
18 return true;
19 else
20 return false;
21 }
22 void push(SqQueue &q,int x) //入队列操作
23 {
24 q.rear++;
25 q.data[q.rear] = x;
26 }
27 SqQueue* Link(SqQueue q[]) //队列连接函数
28 {
29 int i,pre = -1;
30 SqQueue* head = (SqQueue*)malloc(sizeof(SqQueue));
31 for(i=0;i<10;i++){
32 if(!QueueEmpty(q[i])){ //如果当前队列不为空,连接到结果队列中
33 if(pre==-1){
34 q[i].next = NULL;
35 head->next = &q[i];
36 }
37 else{ //如果当前队列不是第一个,上一个队列连接到当前队列
38 q[i].next = NULL;
39 q[pre].next = &q[i];
40 }
41 pre = i;
42 }
43 }
44 return head;
45 }
46 int main()
47 {
48 SqQueue q[10];
49 int n,i;
50 for(i=0;i<10;i++)
51 Init(q[i]);
52 printf("你要输入多少个数?\n");
53 scanf("%d",&n);
54 printf("请输入数据(0<=i<=9):\n");
55 for(i=1;i<=n;i++){ //输入
56 int t;
57 scanf("%d",&t);
58 push(q[t],t);
59 }
60 SqQueue* head = Link(q);
61 head = head->next;
62 printf("连接之后的链表内容:\n");
63 while(head){
64 for(i = head->front+1;i<=head->rear;i++)
65 printf("%d ",head->data[i]);
66 head = head->next;
67 printf("\n");
68 }
69 return 0;
70 }
Freecode : www.cnblogs.com/yym2013