利用链表实现栈和队列
【问题描述】利用链表实现栈和队列
队列具有先进先出的特点,所有新来的元素都放在队列尾部,出队列的元素从队列头部出去。下面是队列的示意图:
栈具有后进先出的特点。所有入栈的元素都放在栈顶,出栈时栈顶元素先出。下面是栈的示意图:
这两种结构具有很多相似的地方:都存放了一系列的元素,元素的操作都在两头进行,元素个数都是动态可变的。我们可以设计一个基类,完成它们共同的功能,然后分别派生出队列类和栈类。本实验要求以上一个实验实现的链表类作为基类并设计它的两个派生类。
要求:
(1) 在上一个实验实现的链表类的基础上派生队列类和栈类,要求队列类可以进行元素入队列和出队列操作,栈类可以进行入栈和出栈操作。
(2) 在队列类中实现一个输出队列内容的函数printQueue,在栈类中实现一个输出栈中内容的函数printStack,
【输入形式】
【输出形式】
【样例输入】
【样例输出】
【样例说明】
【评分标准】
#include <iostream> #include <string> using namespace std; class Person { public: Person(){ } Person(int ID,string name); void showMessage(); int getId(); private: int mId; //编号 string mName; }; Person::Person(int ID,string name) { this->mId=ID; this->mName=name; } int Person::getId() { return mId;} void Person::showMessage() //输出数据 { cout << this->mId << " " << this->mName << endl; } class Node { public: Node(); Node(Person val); friend class LinkList; //把Linklist作为自己的友元类 void showMessage(); protected: Person data; Node *next; //指针指向下一个 }; class LinkList { public: LinkList(); void addNodeAtTail(Person val); void print(); void deleteNode(int id); int getHead (Person &val); //从表头取出 void addNodeAtHead(const Person &val); protected: Node *head; //指针指向头 }; int LinkList::getHead (Person &val) { int n; if(head==NULL) { cout<<"error"<<endl; return 0; } else {n=(head->data).getId(); val=head->data; Node *temp=head; head=head->next; delete temp; } return 1; } void LinkList::deleteNode(int id) { Node* p=NULL, * q=NULL; if (head!= NULL) { p = head; while (p != NULL && p->data.getId() != id) { q = p; p = p->next; } if (p != NULL) { if (p == head) { head = head->next; delete p; } else { q->next = p->next; delete p; } } } } void LinkList::addNodeAtHead(const Person& val) { Node* pNew = new Node(val); pNew->next = head; head = pNew; } void LinkList::addNodeAtTail(Person val) { Node* p, * q; p = new Node(val); if (head == NULL) head = p; else { q = head; while (q->next != NULL) q = q->next; q->next = p; } } void LinkList::print() { Node* ptmp = head; while (ptmp != NULL) { ptmp->showMessage(); ptmp = ptmp->next; } } LinkList::LinkList() { this->head = NULL; } class Queue:public LinkList { public: void enterQueue(const Person &val); int outQueue(Person &val); void printQueue(); }; void Queue::enterQueue(const Person& val) { addNodeAtTail(val); } int Queue::outQueue(Person& val) { return getHead(val); } void Queue::printQueue() { cout<<"queue member:"<<endl; print(); } Node::Node() { next = NULL; } Node::Node(Person val) { data = val; next = NULL; } void Node::showMessage() { data.showMessage(); } class Stack :public LinkList { public: void push(const Person& val); int pop(Person &val); void printStack(); }; void Stack::push(const Person &val) {addNodeAtHead(val);} int Stack::pop(Person &val) {return getHead(val);} void Stack::printStack() {cout<<"stack member:"<<endl; print(); } int main() { string name; Queue *q1=new Queue; Stack *s1=new Stack; cout << "请输入学生姓名:" << endl; Person val; for (int i = 2018003; i >= 2018001; i--) //依次输入名字 { cin >> name; val=Person(i,name); s1->push(val); } for (int i = 2018004; i <= 2018006; i++) //依次输入名字 { cin >> name; val=Person(i,name); q1->enterQueue(val); } cout <<"学生信息为:"<< endl; q1->printQueue(); s1->printStack(); cout<<"outqueue:"<<endl; for(int i=0;i<2;i++) {q1->outQueue(val); val.showMessage(); } cout<<"pop:"<<endl; for(int i=0;i<2;i++) { s1->pop(val); val.showMessage(); } cout<<"after deletes:"<<endl; q1->printQueue(); s1->printStack(); delete q1; delete s1; return 0; }
日期时间类编程
【问题描述】
编程定义日期类Date和时间类Time,Date类的数据成员为年、月、日,Time类则为时、分、秒。Date和Time类共同派生出日期时间类DateTime类。部分代码见代码区。请分析代码功能、设计各类并完善程序,使给出的程序代码正确执行。
Date类中数据输出格式:cout << year << “/” << month << “/” << day << endl;
Time类中数据输出格式:cout << hour << “:” << minute << “:” << second << endl;
【输入形式】
【输出形式】
【样例输入】
【样例输出】
【样例说明】
【评分标准】
#include <iostream> #include<iostream> using namespace std; class Date { public: Date() { } Date(int y, int m, int d) :year(y), month(m), day(d) { } int year; int month; int day; void Display() { cout << year << "/" << month << "/" << day << endl; } }; class Time { public: int hour; int minute; int second; Time() { } Time(int h, int m, int s) :hour(h), minute(m), second(s) { } void Display() { cout << hour << ":" << minute << ":" << second << endl; } }; class DateTime :public Date, public Time { public: DateTime(int _year, int _month, int _day, int _hour, int _minute, int _second) :Date(_year, _month, _day), Time(_hour, _minute, _second) { } DateTime(Date d, Time t) :Date(d), Time(t) { } void Display() { Date::Display(); Time::Display(); } DateTime() { } void SetDateTime(int y, int m, int d, int h, int mi, int s) { year = y; month = m; day = d; hour = h; minute = mi; second = s; } }; void InputDateTime(Date& da, Time& ti) { cout << "请输入日期(年 月日):"; cin >> da.year >> da.month >> da.day; cout << "请输入时间(小时 分钟 秒):"; cin >> ti.hour >> ti.minute >> ti.second; } int main() { Date da; Time ti; DateTime dt1(2020, 4, 4, 10, 0, 0); dt1.Display(); InputDateTime(da, ti); DateTime dt2(da, ti); dt2.Display(); DateTime dt3; dt3.SetDateTime(2020, 4, 4, 12, 47, 56); dt3.Display(); return 0; }