版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21385857/article/details/51077251
3.2(2)假设以I和O分别表示进栈和出栈,站的初态和终栈均为空,写出一个算法判定所给的操作序列是否合法,若合法则返回1,否则返回0.
代码:
#include <iostream>
#include <malloc.h>
using namespace std;
#define MaxSize 50
typedef struct Node
{
char data[MaxSize];
int top;
} LiStack;
void InitStack(LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->top=-1;
}
bool is_legal(LiStack *s,char a[],int n)
{
for(int i=0; i<n; i++)
{
if(a[i]=='I')
{
s->top++;
s->data[s->top]=a[i];
}
else
{
int e;
e=s->data[s->top];
s->top--;
if(s->top==-2)
return false;
}
}
if(s->top==-1)
return true;
return false;
}
int main()
{
LiStack *s;
char a[100],x;
int i=0;
while(cin>>a[i])
i++;
InitStack(s);
if(is_legal(s,a,i))
cout<<"合法!"<<endl;
else
cout<<"不合法"<<endl;
return 0;
}
3.3假设表达式中允许包含三中括号:圆括号、方括号和大括号。编写一个算法判断表达式中的括号是否正确配对。
代码:
#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct
{
char data[1000];
int top;
} SqStack;
void InitStack(SqStack *&s,char a[])
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
bool Is_legal(SqStack *&s,char a[],int n)
{
char e;
if(s->top==n-1)
return false;
for(int i=0; i<n; i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
{
s->top++;
s->data[s->top]=a[i];
}
else
{
e=s->data[s->top];
s->top--;
cout<<e<<a[i]<<" ";
if(i==n-1&&s->top==-1)
return true;
if((e=='('&&a[i]==')')||(e=='['&&a[i]==']')||(e=='{'&&a[i]=='}'))
continue;
else
return false;
}
}
}
int main()
{
SqStack *s;
char a[1000];
int i=0;
while(cin>>a[i])
{
i++;
}
InitStack(s,a);
if(Is_legal(s,a,i))
cout <<"合法"<<endl;
else
cout<<"不合法"<<endl;
return 0;
}
3.4设从键盘输入一个整数序列a1,a2,a3,……an,是编程实现:当ai>0时,ai进队,当ai<0时,将队首元素出队,当ai=0时,输入结束。要求将队列处理成环形队列,进队和出队操作单独编写算法,并在异常情况是(如队满)打印错误信息。
代码:
#include <iostream>
#include <malloc.h>
using namespace std;
#define MaxSize 5
typedef struct
{
int data[MaxSize];
int front,rear;
} SqQueue;
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
bool enQueue(SqQueue *&q,int e)
{
if((q->rear+1)%MaxSize==q->front)
{
cout<<"队列已满!"<<endl;
return false;
}
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
bool daQueue(SqQueue *&q,int e)
{
if(q->front==q->rear)
{
cout<<"队列已为空!"<<endl;
return false;
}
q->front=(q->front+1)%MaxSize;
return true;
}
int main()
{
SqQueue *q;
int a;
InitQueue(q);
while(cin>>a&&a!=0)
{
if(a>0)
enQueue(q,a);
else
daQueue(q,a);
}
return 0;
}