赞
踩
为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!
假设以I和O分别表示入栈和出栈操作。栈的始态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。
设计一个算法,判断所给的操作序列是否合法,若合法,返回true,否则返回false
如果允许在循环队列的两段都可以进行插入和删除操作。要求:写出循环队列的类型定义;写出“从队尾删除”和“从队头删除”的算法
Dev C++或Visual Studio 2019
1.掌握栈与队列的基本程序结构。
利用栈与队列解决实际问题。
1、判断操作合法性的函数设计如下图:
int judge(stack* s, Datatype* str)
{
int i = 0;
for (i = 0; i < strlen(str); i++)
{
if (str[i] == 'I')push(s);
else if (str[i] == 'O')
{
int rs = pop(s);
if (rs == 0) return ERROR;
}
}
if (s->data == NULL) return OK;
return ERROR;
}
2.
void insert(datatype a) //从队头插入
{
Node* nNode=new Node(a);
if(tail==NULL)
{
tail=nNode;
nNode->next=NULL;
}
else
{
tail->next=nNode;
nNode->next=header.next;
}
header.next=nNode;
length++;
}
void getout() //从队尾删除
{
Node *p=tail;
while(p->next!=tail)
p=p->next;
tail=p;p=p->next;
tail->next=header.next;
delete p;
}
#include<iostream>
#include<string.h>
#define OK 1
#define ERROR 0
using namespace std;
typedef char Datatype;
struct stack
{
Datatype data = NULL;
stack* next;
};
void push(stack*& s)
{
stack* newdata = new stack;
newdata->data = 'a';
newdata->next = s;
s = newdata;
}
int pop(stack*& s)
{
if (s->data == NULL) return ERROR;
stack* p = s;
s = s->next;
delete p;
return 1;
}
int judge(stack* s, Datatype* str)
{
int i = 0;
for (i = 0; i < strlen(str); i++)
{
if (str[i] == 'I')push(s);
else if (str[i] == 'O')
{
int rs = pop(s);
if (rs == 0) return ERROR;
}
}
if (s->data == NULL) return OK;
return ERROR;
}
int main()
{
stack s;
Datatype str[100] = "IOIOIOO";
if (strlen(str) > 90) { cout << "overflow!"; return 0; }
if (judge(&s, str) == OK) cout << "LEGAL";
else cout << "INLEGAL";
return 0;
}
#include<iostream>
using namespace std;
typedef int datatype;
struct Node
{
datatype data;
Node* next = NULL;
Node(){}
Node(datatype d)
{
this->data=d;
}
};
struct LinkList
{
Node header;
int length=0;
Node* tail=header.next;
void insert(datatype a) //从队头插入
{
Node* nNode=new Node(a);
if(tail==NULL)
{
tail=nNode;
nNode->next=NULL;
}
else
{
tail->next=nNode;
nNode->next=header.next;
}
header.next=nNode;
length++;
}
void getout() //从队尾删除
{
Node *p=tail;
while(p->next!=tail)
p=p->next;
tail=p;p=p->next;
tail->next=header.next;
delete p;
}
void output() //检查数据
{
Node* p=header.next;
while (p->next!=header.next)
{
cout<<p->data<<"->";
p=p->next;
}
cout<<p->data<<endl;
}
};
int main()
{
LinkList list;
int n=10;
/*cin>>n;
if(n<=1)cout<<"NUMBERS ERROR!";*/
for(int i=1;i<=n;i++)
list.insert(i);
list.getout();
list.output();
return 0;
}
2.
1.时间复杂度:O(n)
空间复杂度:O(n)
2.时间复杂度:O(n)
空间复杂度:O(n)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。