习题3-2 判断栈的合法操作序列
假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可以表示为仅由I和O组成的序列(I表示入栈操作,O表示出栈操作),若根据给出的序列能进行栈操作并且最后栈空,则称该序列为合法序列,否则称为非法序列。
例如:IOIIOIOO、IIIOOIOO为合法序列,而IOOIOIOO、IIIOIOIO为非法序列。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行上输入不超过80个字符的操作序列。
输出格式:
对于每组测试,若序列合法则输出“yes”,否则输出“no”。引号不必输出。
输入样例:
IIIOOIOO
IOOIOIOO
输出样例:
yes
no
出处:
数据结构题集 ISBN:9787115234902 3.5
解题代码:
#include<iostream>
using namespace std;
typedef char ElemType;
struct stackNode{
char data;
stackNode *next;
};
class Stack{
public:
ElemType Top();
void Pop();
void Push(ElemType);
void InitStack();
bool Empty();
void Clear();
private:
stackNode *top;
};
void Stack::InitStack()
{
this->top = new stackNode();
top->next=NULL;
}
ElemType Stack::Top()
{
if(!this->Empty()){
return top->next->data;
}
return ' ';
}
void Stack::Pop()
{
stackNode *p=top->next;
if(!this->Empty()){
top->next=top->next->next;
free(p);
}
}
void Stack::Push(ElemType data){
stackNode *p = new stackNode();
p->data=data;
p->next=top->next;
top->next=p;
}
bool Stack::Empty(){
if(top->next!=NULL){
return false;
}
return true;
}
void Stack::Clear(){
stackNode *p;
while(top->next!=NULL){
p=top->next;
top->next=p->next;
free(p);
}
}
int main()
{
int n;
string str;
Stack stack;
stack.InitStack();
while(cin>>str){
stack.Clear();
int judge=1;
int len = str.size();
for(int i=0;i<len;i++){
if(str[i]=='I'){
stack.Push(str[i]);
}else{
if(stack.Empty()){
judge=0;
break;
}else{
stack.Pop();
}
}
}
if(stack.Empty()&&judge==1){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
}
}
解题思路
这里还是用到了上一题写的链栈,只是更改了一下main函数中的代码,只需要判断入栈出栈就行了,结束的时候要同时判断judge和空栈的时候才为合法,否则不合法,也是蛮简单的。