栈和队列
2018-04-07 20:56 黑鹰1096 阅读(476) 评论(1) 编辑 收藏 举报1.学习总结
2.PTA实验作业
2.1 题目1:
7-1 jmu-字符串是否对称(20 分)
编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。
输入样例:
abba
输出样例:
yes
输入样例:
abcd
输出样例:
no
2.2 设计思路(伪代码或流程图)
#include <iostream>
#include <string>
using namespace std;
struct SqStack{
char data[50];
int top;
};
void InitStack(SqStack *&s);初始化栈
bool Push(SqStack *s,char e)进栈
char Pop(SqStack *s){
return (s->data[s->top--]);
}出栈
2.3 代码截图
2.4 PTA提交列表说明。
刚开始对此题有一种肯定会的感觉,可是做出来的时候都是编译错误 后来为同学才发现是编译器的问题 改了之后就答案正确了。
2.1 题目3:
7-2 银行业务队列简单模拟(25 分)
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:
8 2 1 3 9 4 11 13 15
输出样例:
1 3 2 9 11 4 13 15
2.2 设计思路(伪代码或流程图)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define maxsize 1001
struct customer
{
int data[maxsize];
int top;
};
struct customer *create_stack()
void push(struct customer *stack,int num_of_cus)
2.3 代码截图
2.4 PTA提交列表说明。
知道队列的应用有着银行业务的队列,可是对这些根本就不会 在课堂上的时候还是可以的但是自己做的时候根本就做不到,问同学时候虽能听懂一点但还是编译错误 现在也只能从网上查找 就看明白了。
2.1 题目2:
7-2 符号配对(20 分)
请编写程序检查C语言源程序中下列符号是否配对:/*
与*/
、(
与)
、[
与]
、{
与}
。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.
输出样例1:
NO
/*-?
输入样例2:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.
输出样例2:
NO
?-]
输入样例3:
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.
输出样例3:
YES
2.2 设计思路(伪代码或流程图)
#include<bits/stdc++.h>
using namespace std;
stack<char> sc;
int flag=1;
int check(char ch)
2.3 代码截图
2.4 PTA提交列表说明。
一看题目根本就没有一点思路,从网上查了跟他提醒一样的之后稍微有了点头绪可是编译之后怎么都是错误在从网上查了一遍之后再慢慢写之后答案正确了。
3.截图本周题目集的PTA最后排名
本次2个题目集总分:125+215=340分
必做题共:205分
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:
85分 1分
4. 阅读代码
本次为必做
该代码的功能是线性表的插入、删除、查找、排序、分解、合并、复制、逆转。更简便地写出线性表的相关功能。
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 //线性表初始分配的空间
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define ElemType int
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
void initList_Sq(SqList &L); //构造一个空的线性表L
int listInsert_Sq(SqList &L, int i, ElemType e); //插入元素
int listDelete_Sq(SqList &L, int i, ElemType &e); //将第i个元素删除,并用e返回
int main()
{
SqList L;
int i;
initList_Sq(L);
for(i=1; i<6; ++i)
{
listInsert_Sq(L, i, i);
}
for(i=0; i<L.length; ++i)
{
printf("%d ", L.elem[i]);
}
printf("\n");
listInsert_Sq(L, 4, 6);
printf("After insert:\n");
for(i=0; i<L.length; ++i)
{
printf("%d ", L.elem[i]);
}
printf("\n");
ElemType e;
listDelete_Sq(L, 2, e);
printf("delete the num %d", e);
printf("\n");
for(i=0; i<L.length; ++i)
{
printf("%d ", L.elem[i]);
}
printf("\n");
return 0;
}
void initList_Sq(SqList &L)
{//构造一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem) //存储分配失败
{
exit(-1);
}
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
}
int listInsert_Sq(SqList &L, int i, ElemType e)
{//在第i个元素之前插入一个元素
//i的合法值为 1 <= i && i <= L.length +1
if(i < 1 || i > L.length + 1)
{
return -1;
}
if(L.length >= L.listsize)
{//如果当前存储空间已满,增加分配
ElemType *newbase = (ElemType *)realloc(L.elem,
(L.listsize + LISTINCREMENT) * sizeof(ElemType));
if(!newbase)
{
exit(-1);
}
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElemType *p, *q;
q = &(L.elem[i-1]); //q为要插入元素的位置
for(p=&(L.elem[L.length-1]); p>=q; --p) //q之后的所有元素依次向后移动一位
{
*(p+1) = *p;
}
*q = e; //插入元素
++L.length; //表长增加1
return 0;
}
int listDelete_Sq(SqList &L, int i, ElemType &e)
{//将第i个元素删除,并用e返回
//i的合法值为 1 <= i && i <= L.length
if(i < 1 || i > L.length)
{
return -1;
}
int *p, *q;
p = &(L.elem[i-1]); //p为要删除的元素的位置
e = *p;
q = L.elem + L.length - 1; //表尾元素的地址
for(++p; p<=q; ++p)
{
*(p-1) = *p;
}
--L.length;
return 0;
}