1、(1)分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。
顺序栈
#include <iostream>
using namespace std;
const int MAX=10;
class SeqStack{
private:
int top;
int data[MAX];
public:
SeqStack(){top=-1;}
~SeqStack(){}
void Push(int x);
int Pop();
int GetTop(){if (top!=-1) return data[top];};
int Empty();
};
void SeqStack::Push(int x){
if (top==MAX-1) throw "上溢";
top++;
data[top]=x;
}
int SeqStack::Pop(){
if (top==-1) throw "下溢";
int x=data[top];
top--;
return x;
}
int SeqStack::Empty(){
if (top==-1) return 1; else return 0;
}
int main(){
SeqStack S;
if (S.Empty())
cout<<"栈为空!"<<endl;
else
cout<<"栈不为空!"<<endl;
cout<<"10入栈:"<<endl;
S.Push(10);
cout<<"5入栈:"<<endl;
S.Push(5);
cout<<"取栈顶元素:"<<endl;
cout<<S.GetTop()<<endl;
cout<<"一次出栈:"<<endl;
S.Pop();
cout<<"取栈顶元素:"<<endl;
cout<<S.GetTop()<<endl;
return 0;
}
链栈
#include <iostream>
using namespace std;
struct Data {
int data;
struct Data *next;
} *s;
class SeqStack{
private:
struct Data *top;
public:
SeqStack(){top=NULL;}
~SeqStack(){}
void Push(int x);
int Pop();
int GetTop(){if (top!=NULL) return top->data;};
int Empty();
};
void SeqStack::Push(int x){
s=new struct Data;
s->data=x;
s->next=top;
top=s;
}
int SeqStack::Pop(){
int x=top->data;
top=top->next;
return x;
}
int SeqStack::Empty(){
if (top==NULL) return 1; else return 0;
}
int main(){
SeqStack S;
if (S.Empty())
cout<<"栈为空!"<<endl;
else
cout<<"栈不为空!"<<endl;
cout<<"10入栈:"<<endl;
S.Push(10);
cout<<"5入栈:"<<endl;
S.Push(5);
cout<<"取栈顶元素:"<<endl;
cout<<S.GetTop()<<endl;
cout<<"一次出栈:"<<endl;
S.Pop();
cout<<"取栈顶元素:"<<endl;
cout<<S.GetTop()<<endl;
return 0;
}
(2)分别建立一个顺序队列和链队列,实现队列的入队和出队操作。
顺序队
#include <iostream>
using namespace std;
const int MAX=10;
class Queue{
private:
int front;
int rear;
int data[MAX];
public:
Queue(){front=rear=MAX-1;}
~Queue(){}
void EnQueue(int x);
int DeQueue();
int GetQueue(){if (front!=rear) return data[(front+1)%MAX];};
int Empty();
};
void Queue::EnQueue(int x){
if ((rear-1)%MAX==front) throw "上溢";
rear=(rear+1)%MAX;
data[rear]=x;
}
int Queue::DeQueue(){
if (front==rear) throw "下溢";
int x=data[front];
front=(front+1)%MAX;
return x;
}
int Queue::Empty(){
if (front==rear) return 1; else return 0;
}
int main(){
Queue S;
if (S.Empty())
cout<<"队为空!"<<endl;
else
cout<<"队不为空!"<<endl;
cout<<"10入队:"<<endl;
S.EnQueue(10);
cout<<"5入队:"<<endl;
S.EnQueue(5);
cout<<"取队头元素:"<<endl;
cout<<S.GetQueue()<<endl;
cout<<"一次出队:"<<endl;
S.DeQueue();
cout<<"取队头元素:"<<endl;
cout<<S.GetQueue()<<endl;
return 0;
}
链队
#include <iostream>
using namespace std;
struct Data {
int data;
struct Data *next;
} *q;
class Queue{
private:
Data *rear,*front;
public:
Queue(){rear=NULL;front=NULL;}
~Queue(){}
void EnQueue(int x);
int DeQueue();
int GetQueue();
int Empty();
};
void Queue::EnQueue(int x){
q=new Data;
q->data=x;
q->next=NULL;
if (Empty())
front=rear=q; //若队为空,让队头和队尾指针都指向新增空间
else {
rear->next=q;
rear=q;}
}
int Queue::DeQueue(){
if (Empty()) throw "下溢";
q=front;
int x=front->data;
front=front->next;
delete q;
return x;
}
int Queue::GetQueue(){
if (!Empty())
return front->data;
}
int Queue::Empty(){
if (front==NULL&&rear==NULL) return 1;
else return 0;
}
int main(){
Queue S;
if (S.Empty())
cout<<"队为空!"<<endl;
else
cout<<"队不为空!"<<endl;
cout<<"10入队:"<<endl;
S.EnQueue(10);
cout<<"5入队:"<<endl;
S.EnQueue(5);
cout<<"取队头元素:"<<endl;
cout<<S.GetQueue()<<endl;
cout<<"一次出队:"<<endl;
S.DeQueue();
cout<<"取队头元素:"<<endl;
cout<<S.GetQueue()<<endl;
return 0;
}
2、设计算法并写出代码,实现一个十将二进制转换成2进制数。
#include <iostream>
using namespace std;
struct Data {
int data;
struct Data *next;
} *s;
class SeqStack{
private:
struct Data *top;
public:
SeqStack(){top=NULL;}
~SeqStack(){}
void Push(int x);
int Pop();
void GetSeqBinary();
int Empty();
};
void SeqStack::Push(int x){
s=new struct Data;
s->data=x;
s->next=top;
top=s;
}
int SeqStack::Pop(){
int x=top->data;
top=top->next;
return x;
}
int SeqStack::Empty(){
if (top==NULL) return 1; else return 0;
}
void SeqStack::GetSeqBinary(){
while (top!=NULL){
cout<<top->data;
top=top->next;
}
}
void Change(int m){
SeqStack S;
int k,r;
do{
r=m%2;
S.Push(r);
k=m/2;
m=k;
}while(m!=0);
cout<<"转换成二进制为:"<<endl;
S.GetSeqBinary();
cout<<endl;
}
int main(){
int x;
cout<<"请输入您想转换为二进制的十进制数:"<<endl;
cin>>x;
Change(x);
return 0;
}
3、设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
#include <iostream>
using namespace std;
struct Data {
int data;
struct Data *next;
} *q;
class Queue{
private:
Data *rear,*front;
static int num;
public:
Queue(){rear=NULL;front=NULL;}
~Queue(){}
void EnQueue();
int DeQueue();
void GetQueue();
int Empty();
int Getnum(){return num;}
};
int Queue::num=0;
void Queue::EnQueue(){
num++;
q=new Data;
q->data=num;
q->next=NULL;
if (Empty())
front=rear=q;
else {
rear->next=q;
rear=q;}
}
int Queue::DeQueue(){
if (Empty()) throw "下溢";
q=front;
int x=front->data;
front=front->next;
delete q;
return x;
}
void Queue::GetQueue(){
if (!Empty()){
q=front;
while(q!=NULL){
cout<<q->data<<" ";
q=q->next;
}
cout<<endl;
}
}
int Queue::Empty(){
if (front==NULL||rear==NULL) return 1;
else return 0;
}
int main(){
Queue Q;
int x,flag=0;
cout<<"1、入队排号打饭"<<endl;
cout<<"2、打好饭出队"<<endl;
cout<<"3、队中号码"<<endl;
cout<<"4、退出"<<endl;
do{
cin>>x;
switch (x){
case 1:
Q.EnQueue();
cout<<"排号:"<<Q.Getnum()<<endl;
break;
case 2:
try{
cout<<Q.DeQueue()<<"号已打到饭!"<<endl;}
catch(char *s){
cout<<s<<endl;}
break;
case 3:
cout<<"队中号码为:"<<endl;
Q.GetQueue();
break;
case 4:
flag=1;
break;
}}while(!flag);
return 0;
}