1.在刚开始的界面用户可以自己选择栈操作或者队列操作
2.在栈里,进行入栈操作,以“658 365 36 32”为例以此入栈,遍历进行展示
3.进行出栈,会把658出栈,遵循“先进后出”原则,遍历进行展示
4.进行取栈顶元素以及判空,由于658以及出栈,所以当前栈顶元素为365
5.在队列操作里,进行入队操作,以“20 25 587 6837”为例,遍历进行展示
6.出队操作,遵循“先进先出”原则,会把20出队
7.由于20已经出队,当前队顶元素为25
8.源码如下所示:
#include <iostream>
using namespace std;
//const int StackSize = 10;
//const int QueueSize = 10;
void Stackmenu();
void menu();
void queuemenu();
template<typename t>
struct Node
{
t data;
Node<t>* next;
Node<t>* prior;
};
template<typename T>
struct QNode
{
T data;
QNode<T>* next;
QNode<T>* prior;
};
template <typename t>
class LStack
{
public:
LStack();
~LStack();
void push(t x);
t pop();
t getTop();
int empty();
void printstack();
private:
Node<t>* top;
};
template<typename t>
LStack<t>::LStack()
{
top = nullptr;
}
template<typename t>
LStack<t>::~LStack()
{
}
template<typename t>
void LStack<t>::printstack()
{
if (top ==nullptr)
{
cout << "当前栈为空;"<<endl;
}
else
{
cout << "当前栈为:";
Node<t>* p = top;
while (p)
{
cout << p->data << " ";
p = p->next;
}
system("pause");
//Stackmenu();
}
}
template<typename t>
void LStack<t>::push(t x)
{
Node<t>* s = new Node<t>;
s->data = x;
s->next = top;
top = s;
}
template<typename t>
t LStack<t>::pop()
{
t x;
Node<t>* p;
if (top == nullptr)
{
cout << "下溢"<<endl;
system("pause");
Stackmenu();
}
else
{
x = top->data ;
p = top;
top = top->next;
delete p;
return x;
}
}
template<typename t>
t LStack<t>::getTop()
{
t x;
if (top == nullptr)
{
cout << "下溢"<<endl;
system("pause");
Stackmenu();
}
else
{
x = top->data ;
return x;
}
}
template<typename t>
int LStack<t>::empty()
{
if (top == nullptr)
{
return 1;
}
else
{
return 0;
}
}
template<typename T>
class LQueue
{
public:
LQueue();
~LQueue();
void enQueue(T x);
T deQueue();
T getQueue();
int empty();
void printqueue();
private:
QNode<T>* front, * rear;
};
template<typename T>
void LQueue<T>::printqueue ()
{
if (front == rear)
{
cout << "当前队列为空"<<endl;
}
else
{
cout << "当前队列为:";
QNode<T>* p = front->next ;
while (p)
{
cout << p->data << " ";
p = p->next;
}
system("pause");
//queuemenu();
}
}
template<typename T>
LQueue<T>::LQueue()
{
QNode<T>* s = new QNode<T>;
s->next = nullptr;
front = rear = s;
}
template<typename T>
LQueue<T>::~LQueue()
{
}
template<typename T>
void LQueue<T>::enQueue(T x)
{
QNode<T>* s = new QNode<T>;
s->data = x;
s->next = nullptr;
rear->next = s;
rear = s;
}
template<typename T>
T LQueue<T>::deQueue()
{
T x;
if (rear == front)
{
cout << "下溢"<<endl;
system("pause");
queuemenu();
}
else
{
QNode<T>* p;
p = front->next;
x = p->data;
front->next = p->next;
if (p->next == nullptr)
{
rear = front;
}
delete p;
return x;
}
}
template<typename T>
T LQueue<T>::getQueue()
{
T x;
if (rear == front)
{
cout << "下溢"<<endl;
system("pause");
queuemenu();
}
else
{
x = front->next->data;
return x;
}
}
template<typename T>
int LQueue<T>::empty()
{
if (rear == front)
{
return 1;
}
else
{
return 0;
}
}
void queuemenu()
{
LQueue<string> q;
for (;;)
{
system("cls");
int choice;
string i;
cout << "请选择功能:" << endl;
cout << "1.入队" << endl;
cout << "2.出队" << endl;
cout << "3.取队顶元素" << endl;
cout << "4.判空" << endl;
cout << "5.打印" << endl;
cout << "0.返回上一级" << endl;
cout << "-1.退出程序" << endl;
cin >> choice;
switch (choice)
{
case 1:
cout << "请输入要入队的元素:";
cin >> i;
q.enQueue(i);
system("pause");
break;
case 2:
cout << "出队的元素为:" << q.deQueue () << endl;
system("pause");
break;
case 3:
cout << "当前队顶的元素为:" << q.getQueue () << endl;
system("pause");
break;
case 4:
if (q.empty () == 1)
{
cout << "当前队为空" << endl;
}
else
{
cout << "当前队不为空" << endl;
}
system("pause");
break;
case 5:
//cout << "当前队列为:";
q.printqueue();
cout << endl;
system("pause");
break;
case 0:
menu();
system("pause");
break;
case -1:
exit(0);
default:
cout << "输入错误,请重新输入" << endl;
system("pause");
break;
}
}
}
void Stackmenu()
{
LStack<string> s;
for (;;)
{
system("cls");
int choice;
string i;
cout << "请选择功能:" << endl;
cout << "1.入栈" << endl;
cout << "2.出栈" << endl;
cout << "3.取栈顶元素" << endl;
cout << "4.判空" << endl;
cout << "5.打印" << endl;
cout << "0.返回上一级" << endl;
cout << "-1.退出程序" << endl;
cin >> choice;
switch (choice)
{
case 1:
cout << "请输入要入栈的元素:";
cin >> i;
s.push(i);
system("pause");
break;
case 2:
cout << "出栈的元素为:"<<s.pop() << endl;
system("pause");
break;
case 3:
cout << "当前栈顶的元素为:"<<s.getTop() << endl;
system("pause");
break;
case 4:
if (s.empty() == 1)
{
cout << "当前栈为空" << endl;
}
else
{
cout << "当前栈不为空" << endl;
}
system("pause");
break;
case 5:
//cout << "当前队列为:";
s.printstack();
cout << endl;
system("pause");
break;
case 0:
menu();
system("pause");
break;
case -1:
exit(0);
default:
cout << "输入错误,请重新输入" << endl;
system("pause");
break;
}
//system("pause");
}
}
void menu()
{
int choice;
for (;;)
{
system("cls");
cout << "请选择功能:"<<endl;
cout << "1.栈" << endl;
cout << "2.队列" << endl;
cout << "-1.退出程序" << endl;
cin >> choice;
switch (choice)
{
case 1:
Stackmenu();
break;
case 2:
queuemenu();
break;
case -1:
exit(0);
default:
cout << "输入错误,请重新输入" << endl;
system("pause");
break;
}
}
}
int main()
{
menu();
return 0;
}