数据结构1
第一次上机
1.1 顺序表
#include <iostream>
using namespace std;
#pragma once
template <class T>
class List {
public:
void Clear();
bool IsEmpty();
bool Append(const T value);
bool Insert(const int p, const T value);
bool Delete(const int p);
int GetPos(const T x);
};
template <class T>
class ArrayList : public List<T>
{
public:
ArrayList(const int size)
{
maxSize = size;
arrayList = new T[maxSize];
curLen = 0;
position = 0;
}
~ArrayList()
{
delete[] arrayList;
}
void clear()
{
delete[] arrayList;
curLen = 0;
position = 0;
arrayList = new T[maxSize];
}
int Length();
bool Append(const T value);
bool Insert(const int p, const T value);
bool Delete(const int p);
int GetPos(const T x);
void PrintArray();
private:
T* arrayList;
int maxSize;
int curLen;
int position;
};
template <class T>
int ArrayList<T>::Length()
{
return curLen;
}
template <class T>
bool ArrayList<T>::Append(const T value)
{
if (curLen >= maxSize)
{
cout << "The List is overflow" << endl;
return false;
}
arrayList[curLen] = value;
curLen++;
return true;
}
template <class T>
bool ArrayList<T>::Insert(const int p, const T value)
{
if (curLen >= maxSize){
cout << "The List is overflow" << endl;
return false;
}
if (p < 0||p > maxSize){
cout << "Insertion point is illegal" << endl;
return false;
}
for(int i = curLen;i > p;i--){
arrayList[i] = arrayList[i-1];
}
arrayList[p] = value;
curLen++;
return true;
}
template <class T>
bool ArrayList<T>::Delete(const int p)
{
if(curLen <= 0){
cout << "No element to delete" << endl;
return false;
}
if(p < 0||p > curLen-1){
cout << "Deletion is illegal" << endl;
return false;
}
for(int i = p;i < curLen - 1;i++){
arrayList[i] = arrayList[i+1];
}
curLen--;
return true;
}
template <class T>
int ArrayList<T>::GetPos(const T x)
{
for(int i = 0;i < curLen;i++){
if(arrayList[i] == x){
return i;
}
}
return -1;
}
template <class T>
void ArrayList<T>::PrintArray()
{
for (int i = 0; i < curLen; i++) {
cout << arrayList[i] << " ";
}
cout << endl;
}
int main()
{
int maxsize, pos0, pos1, value0, value1;
cin >> maxsize >> pos0 >> pos1 >> value0 >> value1;
ArrayList<int> arr(maxsize);
int p;
for (int i = 0; i < 5; i++) {
arr.Append(i);
}
arr.PrintArray();
arr.Insert(pos0, value0);
arr.PrintArray();
arr.Delete(pos1);
arr.PrintArray();
p = arr.GetPos(value1);
cout << p << endl;
return 0;
}
1.2 单链表倒置
#include <iostream>
using namespace std;
struct Node {
Node(int x)
{
value = x;
next = NULL;
}
int value;
Node* next;
};
Node* Reverse(Node* first)
{
Node *p,*q;
p = first;
q = NULL;
Node *temp;
while(p != NULL){
temp = p;
p = p->next;
temp->next = q;
q = temp;
}
}
void print(Node* node)
{
while (NULL != node) {
cout << node->value << " ";
node = node->next;
}
}
int main()
{
int iNum;
cin >> iNum;
Node* a = NULL;
Node* pTemp;
for (int i = 0; i < iNum; i++) {
int tmp;
cin >> tmp;
if (i == 0) {
a = new Node(tmp);
pTemp = a;
} else {
pTemp->next = new Node(tmp);
pTemp = pTemp->next;
}
}
cout << "倒置前为:";
print(a);
cout << endl;
Node* r = Reverse(a);
cout << "倒置后为:";
print(r);
cout << endl;
return 0;
}
1.3 将两个有序链表合并成一个非递减有序的单链表
#include <iostream>
using namespace std;
const int MinNumber = -1000000;
struct Node {
Node(int x)
{
value = x;
next = NULL;
}
int value;
Node* next;
};
Node* Merge(Node* a, Node* b)
{
Node *p=NULL;
Node *q=NULL;
if(a->value < b->value){
p = a;
q = a;
a = a->next;
}
else{
p = b;
q = b;
b = b->next;
}
while(a && b){
if(a->value <= b->value){
p->next = a;
a = a->next;
}
else{
p->next = b;
b = b->next;
}
p = p->next;
}
p->next = a? a : b;
return q;
}
void print(Node* pNode)
{
while (pNode != NULL) {
cout << pNode->value << " ";
pNode = pNode->next;
}
cout << endl;
}
Node* init()
{
int count;
cin >> count;
Node *p = NULL, *q;
for (int i = 0; i < count; i++) {
int iValue;
cin >> iValue;
if (NULL == p) {
p = new Node(iValue);
q = p;
} else {
q->next = new Node(iValue);
q = q->next;
}
}
return p;
}
int main()
{
Node* ha = init();
Node* hb = init();
cout << "合并前链表1为:";
print(ha);
cout << "合并前链表2为:";
print(hb);
Node* head = Merge(ha, hb);
cout << "合并后的单链表为:";
print(head);
return 0;
}
1.4 顺序栈
#include <iostream>
using namespace std;
template <class T>
class Stack {
public:
void Clear();
bool Push(const T item);
bool Pop(T& item);
bool Top(T& item);
bool IsEmpty();
bool IsFull;
};
template <class T>
class ArrayStack : public Stack<T> {
public:
ArrayStack(int size)
{
maxSize = size;
top = -1;
st = new T[maxSize];
}
ArrayStack()
{
top = -1;
}
~ArrayStack()
{
delete[] st;
}
void Clear()
{
top = -1;
}
bool Push(const T item)
{
if(top == maxSize - 1){
cout << "栈满溢出" << endl;
return false;
}
else{
st[++top] = item;
return true;
}
}
bool Pop(T& item)
{
if(top == -1){
cout << "栈为空,不能进行删除操作" << endl;
return false;
}
else{
item = st[top--];
return true;
}
}
bool Top(T& item)
{
if(top == -1){
cout << "栈为空,不能读取栈顶元素" << endl;
return false;
}
else{
item = st[top];
return true;
}
}
private:
int maxSize;
int top;
T* st;
};
int main()
{
int maxsize, loop_num, temp;
cin >> maxsize >> loop_num >> temp;
ArrayStack<int> as(maxsize);
for (int i = 1; i < loop_num; i++) {
as.Push(i);
}
as.Push(temp);
cout << "入栈:" << temp << endl;
as.Pop(temp);
cout << "出栈:" << temp << endl;
as.Top(temp);
cout << "读取栈顶元素:" << temp << endl;
return 0;
}
1.5 顺序队列
#include <iostream>
using namespace std;
template <class T>
class ArrayQueue {
private:
int maxSize;
int front;
int rear;
int* queue;
public:
ArrayQueue(int size)
{
maxSize = size + 1;
queue = new T[maxSize];
front = rear = 0;
}
~ArrayQueue()
{
delete[] queue;
}
void Clear()
{
front = rear;
}
bool EnQueue(const T item)
{
if(this->IsFull()){
return false;
}
queue[rear] = item;
rear = (rear + 1) % maxSize;
return true;
}
bool DeQueue(T& item)
{
if(this->IsEmpty()){
return false;
}
item = queue[front];
front = (front + 1) % maxSize;
return true;
}
bool GetFront(T& item)
{
if(this->IsEmpty()){
return false;
}
item = this->queue[this->front];
return true;
}
bool IsEmpty()
{
if (front == rear) {
cout << "队列为空" << endl;
return true;
} else {
return false;
}
}
bool IsFull()
{
if ((rear + 1) % maxSize == front) {
cout << "队列已满,溢出" << endl;
return true;
} else {
return false;
}
}
};
int main()
{
int maxsize = 0, iNum = 0, temp1 = 0, temp2 = 0, temp3 = 0;
cin >> maxsize >> iNum >> temp1;
ArrayQueue<int> aq(maxsize);
for (int i = 0; i < iNum; i++) {
aq.EnQueue(i * 3);
}
aq.EnQueue(temp1);
aq.DeQueue(temp2);
cout << "出队:" << temp2 << endl;
aq.GetFront(temp3);
cout << "读取队头元素:" << temp3 << endl;
return 0;
}
第二次上机
2.1 采用顺序栈判断表达式中的括号是否正确配对
#include <cstring>
#include <iostream>
#include <string.h>
using namespace std;
class stack {
private:
int maxsize;
int top;
char* st;
public:
stack(int size)
{
maxsize = size;
top = -1;
st = new char[maxsize];
}
void push(char item)
{
st[++top] = item;
}
void pop()
{
top--;
}
bool empty()
{
return top == -1;
}
};
char* Bracketmatch(const char* c)
{
char result[] = "111";
int len = strlen(c);
stack small(len);
stack mid(len);
stack larg(len);
for(int i = 0;c[i] != '\0';i++)
{
if(c[i] == '{'){
larg.push(c[i]);
}
if(c[i] == '['){
mid.push(c[i]);
}
if(c[i] == '('){
small.push(c[i]);
}
if(c[i] == ')'){
if(!small.empty()){
small.pop();
}
else{
result[0] = '0';
}
}
if(c[i] == ']'){
if(!mid.empty()){
mid.pop();
}
else{
result[1] = '0';
}
}
if(c[i] == '}'){
if(!larg.empty()){
larg.pop();
}
else{
result[2] = '0';
}
}
}
if(!small.empty()){
result[0] = '0';
}
if(!mid.empty()){
result[1] = '0';
}
if(!larg.empty()){
result[2] = '0';
}
char *p = new char[len+1];
strcpy(p,result);
return p;
}
void printResult(char* p)
{
if (NULL != p) {
if (p[0] == '1') {
cout << "()匹配" << endl;
} else {
cout << "()不匹配" << endl;
}
if (p[1] == '1') {
cout << "[]匹配" << endl;
} else {
cout << "[]不匹配" << endl;
}
if (p[2] == '1') {
cout << "{}匹配" << endl;
} else {
cout << "{}不匹配" << endl;
}
}
}
int main()
{
string s;
getline(cin, s);
cout << s << endl;
char* result = Bracketmatch(s.c_str());
printResult(result);
delete result;
return 0;
}
2.2 链式栈-中缀表达式
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
template <class T>
class stack {
private:
int top;
int maxtop;
T* st;
public:
stack(int maxstacksize = 10) {
maxtop = maxstacksize - 1;
st = new T[maxstacksize];
top = -1;
}
~stack() {
delete[] st;
}
bool isfull() {
return top == maxtop;
}
bool isempty() {
return top == -1;
}
bool add(const T& x) {
if (isfull()) {
cout << "no memory" << endl;
return false;
}
top++;
st[top] = x;
return true;
}
T del() {
if (isempty()) {
cerr << "no element" << endl;
}
T x;
x = st[top];
top--;
return x;
}
T returntop() {
return st[top];
}
void clear() {
top = -1;
}
void output() {
if (isempty()) {
cout << "栈是空的" << endl;
} else {
for (int i = 0; i <= top; i++) {
cout << st[i] << '\t';
}
cout << endl;
}
}
};
class Calculator {
public:
string infix;
string postfix;
stack<double> poststack;
Calculator(string str);
~Calculator() {
poststack.clear();
}
void infix_to_suffix();
int inStack(char ch);
int outStack(char ch);
void cal_suffix();
void print();
bool Get_operands(double& left, double& right);
bool isNumber(char ch);
double returnnum(char* c, int n);
float toNum(char num_ch);
void cal(char ch);
};
Calculator::Calculator(string str) {
infix = str;
}
void Calculator::infix_to_suffix() {
int len = infix.length();
for(int i = 0; i < len; i++) {
if(isNumber(infix[i])){
postfix += infix[i];
postfix += '&';
}
else if(infix[i] == '('){
poststack.add(infix[i]);
}
else if(infix[i] == ')'){
while(!poststack.isempty() && poststack.returntop() != '('){
char t = poststack.del();
postfix += t;
}
poststack.del();
}
else{
while(!poststack.isempty() && poststack.returntop() != '(' && outStack(infix[i]) <= inStack(poststack.returntop())){
char temp = poststack.del();
postfix += temp;
}
poststack.add(infix[i]);
}
}
while(!poststack.isempty()){
char temp1 = poststack.del();
postfix += temp1;
}
}
void Calculator::cal_suffix() {
infix_to_suffix();
int len = postfix.length();
for(int i = 0; i < len; i++) {
if(postfix[i] == '&') {
continue;
}
else if(isNumber(postfix[i])) {
poststack.add(toNum(postfix[i]));
}
else if(postfix[i] == '+' || postfix[i] == '-' || postfix[i] == '*' || postfix[i] == '/') {
cal(postfix[i]);
}
else{
cout << "重新输入 并检查表达式的合法性" << endl;
exit(0);
}
}
}
bool Calculator::Get_operands(double& left, double& right) {
if (poststack.isempty()) {
cout << "缺少右操作数" << endl;
return false;
}
right = poststack.del();
if (poststack.isempty()) {
cout << "缺少左操作数" << endl;
return false;
}
left = poststack.del();
return true;
}
double Calculator::returnnum(char* c, int n) {
int l = n;
double num = 0;
double m = 1;
for (int i = l - 1; i >= 0; i--) {
num += toNum(c[i]) * m;
m *= 10;
}
return num;
}
int Calculator::inStack(char c) {
switch (c) {
case '#':
return 0;
break;
case '(':
return 1;
break;
case '*':
case '/':
case '%':
return 5;
break;
case '+':
case '-':
return 3;
break;
case ')':
return 6;
break;
}
}
int Calculator::outStack(char c) {
switch (c) {
case '#':
return 0;
break;
case '(':
return 6;
break;
case '*':
case '/':
case '%':
return 4;
break;
case '+':
case '-':
return 2;
break;
case ')':
return 1;
break;
}
}
bool Calculator::isNumber(char ch) {
if (48 <= ch && ch <= 57)
return true;
else
return false;
}
float Calculator::toNum(char num_ch) {
switch (num_ch) {
case '0':
return 0;
break;
case '1':
return 1;
break;
case '2':
return 2;
break;
case '3':
return 3;
break;
case '4':
return 4;
break;
case '5':
return 5;
break;
case '6':
return 6;
break;
case '7':
return 7;
break;
case '8':
return 8;
break;
case '9':
return 9;
break;
}
}
void Calculator::cal(char cp) {
double left, right, value;
if (Get_operands(left, right)) {
switch (cp) {
case '+': {
value = left + right;
poststack.add(value);
break;
}
case '-': {
value = left - right;
poststack.add(value);
break;
}
case '*': {
value = left * right;
poststack.add(value);
break;
}
case '/':
if (right == 0) {
cout << "/ 操作符 右操作数为0" << endl;
exit(1);
} else {
value = left / right;
poststack.add(value);
}
break;
}
}
}
void Calculator::print() {
cout << "表达式计算结果:" << endl;
cout << poststack.returntop() << endl;
}
int main() {
string str;
cout << "输入一个中缀表达式:" << endl;
cin >> str;
Calculator calculator(str);
calculator.cal_suffix();
calculator.print();
return 0;
}
2.3 串匹配KMP算法
#include <iostream>
#include <string.h>
using namespace std;
void GetNext(char T[], int next[])
{
int len = strlen(T);
next[0] = 0;
for(int i = 1;i < len;i++){
int j = next[i-1];
while(j > 0 && T[i] != T[j]){
j = next[j-1];
}
if(T[i] == T[j]){
next[i] = j + 1;
}
else{
next[i] = 0;
}
}
}
int KMP(char S[],char T[])
{
int i = 0;
int j = 0;
int next[80];
GetNext(T,next);
for(i = 0;i < strlen(S); i++){
while(T[j] != S[i] && j > 0){
j = next[j-1];
}
if(S[i] == T[j]){
j++;
}
if(j == strlen(T)){
return(i-j+2);
}
}
return 0;
}
int main()
{
const int size = 20;
char S[size];
char T[size];
cout<<"请输入主串S:"<<endl;
cin>>S;
cin.get();
cout<<"请输入查找模式T:"<<endl;
cin>>T;
cin.get();
int index = KMP(S,T);
for (int i = 1; i < index; i++)
cout<<" ";
cout<<T<<"在"<<endl;
cout<<S<<"中的位置是:"<<index<<endl;
return 0;
}
第三次上机
队列:银行叫号系统的实现
#include <bits/stdc++.h>
using namespace std;
int gid = 1;
class User
{
public:
int id;
bool isWait = true;
int ArriveTime;
char type;
};
class BankWindow
{
public:
bool isBusy = false;
int id;
char type;
int timei = 0;
User client;
};
class Simulater
{
private:
int cMatrix[7][3] = {
{
3, 1, 1}, {
5, 0, 0}, {
0, 0, 0}, {
5, 1, 0}, {
0, 0, 0}, {
0, 0, 0}, {
0, 0, 0}};
BankWindow n[3], v, o;
queue<User> NormalUserQueue;
queue<User> VIPUserQueue;
queue<User> OfficialUserQueue;
public:
void setWindow();
void simulateCustomerEnter(User &u);
void simulateCallCustomer();
void Simulate();
void printWindow();
};
void Simulater::simulateCu