1:顺序栈
查看提交统计提问
总时间限制: 10000ms 内存限制: 5000kB
描述
编写一个程序实现顺序栈(假设栈中元素类型为char)的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序栈S;
(2)判断顺序栈S是否为空;
(3)依次进栈元素a,b,c,d,e;
(4)判断顺序栈S是否为空;
(5)输出顺序栈长度;
(6)输出从栈顶到栈底的元素;
(7)输出出栈序列;
(8)判断顺序栈S是否为空;
(9)释放顺序栈。
输入
两行数据,第一行是入栈字符数据的个数,第二行是具体入栈的字符数据。
输出
按照程序要求输出。
样例输入
5
a b c d e
样例输出
yes
no
5
e d c b a
e d c b a
yes
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=100;
#define ElemType char
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof (SqStack));
s->top=-1;
}
void DestoryStack(SqStack *&s)
{
free(s);
}
bool StackEmpty(SqStack *&s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType &e)
{
if(s->top==MaxSize)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
bool GetTop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
return true;
}
int getlength(SqStack *&s)
{
return s->top+1;
}
void dispstack(SqStack *&s)
{
for(int i=s->top;i>=0;i--)
{
cout<<s->data[i]<<" ";
}
cout<<endl;
}
int main()
{
SqStack *s;
InitStack(s);
if(StackEmpty(s))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
int n;
char e;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>e;
Push(s,e);
}
if(StackEmpty(s))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
cout<<getlength(s)<<endl;
// if(GetTop(s,e)==1)
// {
// cout<<e<<endl;
// }
dispstack(s);
while(GetTop(s,e))
{
cout<<e<<" ";
Pop(s,e);
}
cout<<endl;
if(StackEmpty(s))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
DestoryStack(s);
return 0;
}
2:括号匹配
查看提交统计提问
总时间限制: 1000ms 内存限制: 1000kB
描述
假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.
输入一串括号
如果输入的右括号多余,输出:Extra right brackets
如果输入的左括号多余, 输出:Extra left brackets
如果输入的括号不匹配,输出:Brackets not match
如果输入的括号匹配,输出:Brackets match
输入
{{{{)))
输出
Brackets not match
样例输入
{([)]}
样例输出
Brackets not match
提示
利用栈结构
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
const int MaxSize=100;
#define ElemType char
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof (SqStack));
s->top=-1;
}
void DestoryStack(SqStack *&s)
{
free(s);
}
bool StackEmpty(SqStack *&s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType &e)
{
if(s->top==MaxSize)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
bool GetTop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
return true;
}
int getlength(SqStack *&s)
{
return s->top+1;
}
void dispstack(SqStack *&s)
{
for(int i=s->top;i>=0;i--)
{
cout<<s->data[i]<<" ";
}
cout<<endl;
}
void judge(char a[],int n)
{
SqStack *s;
InitStack(s);
char e;
// char a[100];
bool flag=true;
for(int i=0;i<n;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
{
Push(s,a[i]);
}
else{
if(StackEmpty(s))
{
cout<<"Extra right brackets"<<endl;
flag=false;
break;
}
else
{
if((a[i] == ')'&&GetTop(s,e)&&e=='(')||(a[i] == ']'&&GetTop(s,e)&&e=='[')||(a[i] == '}'&&GetTop(s,e)&&e=='{'))
{
Pop(s,a[i]);
continue;
}
else{
cout<<"Brackets not match"<<endl;
flag=false;
break;
}
}
}
}
if(flag==true)
{
if(StackEmpty(s))
cout<<"Brackets match"<<endl;
else
cout<<"Extra left brackets"<<endl;
}
}
int main()
{
SqStack *s;
InitStack(s);
int n;
char e;
char a[100];
cin>>a;
for(int i=0;i<strlen(a);i++)
{
Push(s,a[i]);
}
judge(a,strlen(a));
// dispstack(s);
DestoryStack(s);
return 0;
}
3:选择题 - 队列
查看提交统计提问
总时间限制: 10000ms 内存限制: 10000kB
描述
若用一个大小为6的数组来实现循环队列,且当rear和front的值分别为0,3。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为:( )
A. 1和5 B. 2和4 C. 4和2 D. 5和1
选B
队列是3 4 5 0,其中front是3,rear是0。删除一个元素,从front删除,变成了4;增加两个元素,从rear增加,变成了1 2,最终变成了4(front) 5 0 1 2(rear)。
4:顺序循环队列
查看提交统计提问
总时间限制: 10000ms 内存限制: 5000kB
描述
编写一个程序实现顺序循环队列(假设队列中元素类型为char)的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化队列q;
(2)判断队列q是否为空;
(3)依次进队列元素。输入两行数据,第一行是进队字符数据的个数,第二行是具体入队的字符数据。
3
a b c
(4)出队一个元素,并输出该元素;
(5)输出队列q的元素个数;
(6)依次进队列元素。输入两行数据,第一行是进队字符数据的个数,第二行是具体入队的字符数据。
3
d e f
(7)输出队列q的元素个数;
(8)输出出队序列;
(9)释放队列。
输入
按照程序要求输入。
输出
按照程序要求输出。
样例输入
3
a b c
3
d e f
样例输出
yes
a
2
5
b c d e f
我发现我用c语言就写不好这种题(过不了oj),太奇怪了。都贴在这里吧~
c版:
#include <stdio.h>
#include <malloc.h>
#define Maxqsize 100
typedef char ElemType;
typedef struct {
ElemType elem[Maxqsize];
int front,rear;
} SqQueue;
void InitQueue(SqQueue *&q) {
q=(SqQueue *)malloc (sizeof(SqQueue));
q->front=q->rear=0;
}
void ClearQueue(SqQueue *&q) {
free(q);
}
int QueueLength(SqQueue *q) {
return (q->rear-q->front+Maxqsize)%Maxqsize;
}
int QueueEmpty(SqQueue *q) {
return(q->front==q->rear);
}
int enQueue(SqQueue *&q,ElemType e) {
if ((q->rear+1)%Maxqsize==q->front)
return 0;
q->rear=(q->rear+1)%Maxqsize;
q->elem[q->rear]=e;
return 1;
}
int deQueue(SqQueue *&q,ElemType &e) {
if (q->front==q->rear)
return 0;
q->front=(q->front+1)%Maxqsize;
e=q->elem[q->front];
return 1;
}
int main() {
ElemType e;
SqQueue *q;
InitQueue(q);
if(QueueEmpty(q))
{
printf("yes\n");
}
else
{
printf("no\n");
}
int n;
scanf("%d",&n);
getchar();
char g;
for(int i=0;i<n;i++)
{
scanf("%c",&g);
getchar();
enQueue(q,g);
}
if (deQueue(q,e)==1)
printf("%c\n",e);
printf("%d\n",QueueLength(q));
int m;
scanf("%d",&m);
getchar();
char f;
for(int i=0;i<m;i++)
{
scanf("%c",&f);
getchar();
enQueue(q,f);
}
printf("%d\n",QueueLength(q));
while (!QueueEmpty(q)) {
deQueue(q,e);
printf("%c ",e);
}
printf("\n");
ClearQueue(q);
return 0;
}
c++版
#include <iostream>
#include <malloc.h>
#define Maxqsize 100
using namespace std;
typedef char ElemType;
typedef struct {
ElemType elem[Maxqsize];
int front,rear;
} SqQueue;
void InitQueue(SqQueue *&q) {
q=(SqQueue *)malloc (sizeof(SqQueue));
q->front=q->rear=0;
}
void ClearQueue(SqQueue *&q) {
free(q);
}
int QueueLength(SqQueue *q) {
return (q->rear-q->front+Maxqsize)%Maxqsize;
}
int QueueEmpty(SqQueue *q) {
return(q->front==q->rear);
}
int enQueue(SqQueue *&q,ElemType e) {
if ((q->rear+1)%Maxqsize==q->front)
return 0;
q->rear=(q->rear+1)%Maxqsize;
q->elem[q->rear]=e;
return 1;
}
int deQueue(SqQueue *&q,ElemType &e) {
if (q->front==q->rear)
return 0;
q->front=(q->front+1)%Maxqsize;
e=q->elem[q->front];
return 1;
}
int main() {
ElemType e;
SqQueue *q;
InitQueue(q);
if(QueueEmpty(q)==1)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
int n;
cin>>n;
char g;
for(int i=0;i<n;i++)
{
cin>>g;
enQueue(q,g);
}
if (deQueue(q,e)==1)
cout<<e<<endl;
cout<<QueueLength(q)<<endl;
int m;
cin>>m;
char f;
for(int i=0;i<m;i++)
{
cin>>f;
enQueue(q,f);
}
cout<<QueueLength(q)<<endl;
while (!QueueEmpty(q)) {
deQueue(q,e);
cout<<e<<" ";
}
cout<<endl;
ClearQueue(q);
return 0;
}
5:链队列
查看提交统计提问
总时间限制: 10000ms 内存限制: 5000kB
描述
编写一个程序实现链队列(假设队列中元素类型为char)的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化队列q;
(2)判断队列q是否为空;
(3)依次进队列元素。输入两行数据,第一行是进队字符数据的个数,第二行是具体入队的字符数据。
3
a b c
(4)出队一个元素,并输出该元素;
(5)输出队列q的元素个数;
(6)依次进队列元素。输入两行数据,第一行是进队字符数据的个数,第二行是具体入队的字符数据。
3
d e f
(7)输出队列q的元素个数;
(8)输出出队序列;
(9)释放队列。
输入
按照程序要求输入。
输出
按照程序要求输出。
样例输入
3
a b c
3
d e f
样例输出
yes
a
2
5
b c d e f
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=100;
#define ElemType char
typedef struct qnode
{
ElemType data;
struct qnode *next;
}DataNode;
typedef struct
{
DataNode *front;
DataNode *rear;
}LinkQuNode;
void InitQueue(LinkQuNode *&q)
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
void DestoryQueue(LinkQuNode *&q)
{
DataNode *p=q->front,*r;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;
r=p->next;
}
}
free(p);
free(q);
}
bool QueueEmpty(LinkQuNode *q)
{
return(q->rear==NULL);
}
/*入队操作要注意别动指向队头的front指针
如果是q->front->next = p那每次就会插到队头。
而队列是队头出,队尾进。
也不要忘了新节点p->next = NULL;*/
void enQueue (LinkQuNode *&q,ElemType e)
{
DataNode * p ;
p =( DataNode *) malloc ( sizeof ( DataNode ));
p -> data = e ;//把e的值赋给p
p -> next = NULL ;//p是最后一个
if ( q -> front == NULL ) //如果队列为空
q -> front = q -> rear = p ;
else {
q -> rear -> next = p ;//尾节点的下一个指向p
q->rear=p;//尾节点指向p
}
}
bool deQueue ( LinkQuNode *& q , ElemType & e)
{
DataNode * t ;
if ( q -> front == NULL ) return false ;//队列为空
t = q -> front ; //指向第一个数据结点
if ( q -> front == q -> rear ) //队列中只有一个结点时
q -> front = q -> rear = NULL ;//把这个销毁就行了
else //有多个时
q -> front = q -> front -> next ;//让front下移一个
e = t -> data ;
free ( t );
return true ;
}
void enQueue1 (LinkQuNode *&q,ElemType e)
{
DataNode * p ;
p -> data = e ;//把e的值赋给p
q -> rear -> next = p ;//尾节点的下一个指向p
q->rear=p;
p -> next = NULL ;//p是最后一个
if ( q -> front == NULL ) //如果队列为空
q -> front = q -> rear = p ;
else {
q -> rear -> next = p ;//尾节点的下一个指向p
q->rear=p;//尾节点指向p
}
}
int getlength(LinkQuNode *&q)
{
int i=0;
DataNode *p=q->front;
while(p)
{
i++;
p=p->next;
}
return i;
}
void print(LinkQuNode *&q)
{
// q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
DataNode *p=q->front;
// if (QueueEmpty(q)) {
// printf("空队\n");
// }
while (p) {
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
// cout<<p->data<<endl;
}
int main()
{
LinkQuNode *q;
InitQueue(q);
if(QueueEmpty(q)==1)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
int n;
cin>>n;
char e;
for(int i=0;i<n;i++)
{
cin>>e;
enQueue (q ,e );
}
if(deQueue (q,e)==1)
{
cout<<e<<endl;
// deQueue (q , e);
}
cout<<getlength(q)<<endl;
int m;
cin>>m;
char f;
for(int i=0;i<m;i++)
{
cin>>f;
enQueue (q ,f);
}cout<<getlength(q)<<endl;
print(q);
DestoryQueue(q);
return 0;
}
6:舞伴问题
查看提交统计提问
总时间限制: 10000ms 内存限制: 10000kB
描述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
输入
第一行男士人数m和女士人数n;
第二行舞曲的数目k。
输出
共k行,每行两个数,表示配对舞伴的序号,男士在前,女士在后。
样例输入
4 3
6
样例输出
1 1
2 2
3 3
4 1
1 2
2 3
呃,好像老师要求用链队列来写,我就先偷懒一下哈
#include<iostream>
using namespace std;
int main()
{
int m,n,k;
cin>>m>>n;
int a[m],b[n];
for(int i=0;i<m;i++)
{
a[i]=i+1;
}
for(int i=0;i<n;i++)
{
b[i]=i+1;
}
cin>>k;
int p=0,q=0;
for(int i=0;i<k;i++)
{
cout<<a[i-p*m]<<" "<<b[i-q*n]<<endl;
if(a[i-p*m]==m&&b[i-q*n]!=n)
{
p++;
}
else if(b[i-q*n]==n&&a[i-p*m]!=m)
{
q++;
}
else if(a[i-p*m]==m&&b[i-q*n]==n)
{
p++;
q++;
}
}
return 0;
}