假设以I和O分别表示进栈和出栈操作,栈的初态和终态均为空,进栈和出栈的操作序列可表示为仅由I和O组成的序列。
顺序栈的定义为
输入(IOIIOIOO)
输入为一个字符串,表示进栈出栈的操作序列,该序列存储在栈中。
输出
若操作序列合法则输出“Yes”,否则输出"No"。
问题分析:指定一个序列,扫描这个序列任何位置时,O的个数(出栈次序)都小于I的个数(入栈次序),若大于,则不合法序列,整个序列都扫描后,O的个数都应该等于I的个数,否则为不合法序列。
代码如下:
int judge(SqStack *s)
{
int i=0;
int j=0;
int k=0;
for (;s->data[i]!='\0';i++)
{
switch(s->data[i])
{
case 'I':j++;break;
case 'O':k++; if(k>j) return 0;break;
}
}
if(j==k)
return 1;
else
return 0;
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SizeMax 105
typedef char ElemType;
typedef struct
{
ElemType data[SizeMax];
int top;
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack*)malloc(sizeof(SqStack));
s->top=-1;
}
bool Push(SqStack *&s,ElemType c)
{
if(s->top==SizeMax-1)return false;
s->top++;
s->data[s->top]=c;
return true;
}int judge(SqStack *s)
{
int i;
int j=0;
int k=0;
for (i=0;s->data[i]!='\0';i++)
{
switch(s->data[i])
{
case 'I':j++;break;
case 'O':k++;
if(k>j)
{
return 0;
}
break;
}
}
if(j!=k)
return 0;
else
return 1;
}
void DestroyStack(SqStack *&s)
{
free(s);
}
int main()
{
SqStack *s=NULL;
InitStack(s);
char c[SizeMax];
gets(c);
for(int i=0;i<(int)strlen(c);i++)
Push(s,c[i]);
if(judge(s))printf("Yes\n");
else printf("No\n");
DestroyStack(s);
return 0;
}