数据结构的实验,栈和队列的实现。
栈的特点:先进后出,类似于一个只有一个口子,且一次只能容一个物体通过的容器,放在上面的物体必须先拿出才能拿下面的。
队列的特点:先进先出,类似于火车通过隧道,先进入隧道的先出隧道,切只能从隧道一边进入,一边出去。
我下面用的是链式结构来实现。
首先是栈的代码:
1 #include<iostream> 2 using namespace std; 3 //************链式栈的应用************ 4 //结构定义 5 typedef struct StackNode{ 6 int data; 7 struct StackNode *next; 8 }StackNode,*LinkStack; 9 10 //初始化 11 void InitStack(LinkStack &S) 12 { 13 S = NULL; 14 } 15 16 //入栈 17 void Push(LinkStack &S,int e) 18 { 19 StackNode *p = new StackNode;//创建一个新节点 20 p->data = e;//新节点的值为 e 21 p->next = S;//S为上一次的第一个节点,让新加入的节点指向它; 22 S = p;//将新加入的节点为S(第一个节点) 23 } 24 25 //删除栈顶元素 26 void Pop(LinkStack &S) 27 { 28 if(S == NULL) 29 { 30 cout<<"栈已空"<<endl; 31 return; 32 } 33 StackNode *p = new StackNode; 34 p = S; 35 S = S->next; 36 delete p; 37 } 38 39 //判断栈是否为空 40 int StackEmpty(LinkStack S) 41 { 42 if(S == NULL) 43 return 1; 44 else 45 return 0; 46 } 47 48 //取栈顶元素 49 int GetTop(LinkStack S) 50 { 51 if(S != NULL) 52 return S->data; 53 } 54 55 int main() 56 { 57 LinkStack S; 58 int n,a; 59 while(cin>>n) 60 { 61 InitStack(S); 62 for(int i=0; i<n; ++i) 63 { 64 cin>>a; 65 Push(S,a);//入栈 66 } 67 68 while(!StackEmpty(S)) 69 { 70 cout<<GetTop(S)<<' ';//出栈 71 Pop(S);//删除栈顶元素 72 } 73 cout<<endl; 74 } 75 delete S; 76 return 0; 77 }
接着是队列的代码:
1 #include<iostream> 2 using namespace std; 3 //**************链式队列应用************** 4 5 //结构定义 6 typedef struct QNode{ 7 int data; 8 struct QNode *next; 9 }QNode,*QueuePtr; 10 typedef struct{ 11 QueuePtr front,rear; 12 }LinkQueue; 13 14 //初始化 15 void InitQueue(LinkQueue &Q) 16 { 17 Q.front = Q.rear = new QNode; 18 Q.front->next = NULL; 19 } 20 21 22 //入队 23 void EnQueue(LinkQueue &Q,int e) 24 { 25 QNode *q = new QNode; 26 q->data = e; 27 q->next = NULL; 28 Q.rear->next = q; 29 Q.rear = q; 30 } 31 32 //判断队列是否为空 33 int QueueEmpty(LinkQueue Q) 34 { 35 if(Q.rear == Q.front) 36 return 1; 37 else 38 return 0; 39 } 40 41 //删除队头元素 42 void DeQueue(LinkQueue &Q) 43 { 44 if(Q.rear == Q.front) 45 { 46 cout<<"队列已空"<<endl; 47 return; 48 } 49 QNode *q = new QNode; 50 q = Q.front->next; 51 Q.front->next = q->next; 52 if(Q.rear == q) 53 Q.rear = Q.front; 54 delete q; 55 } 56 57 //出队 58 int GetQueue(LinkQueue Q) 59 { 60 if(Q.front != Q.rear) 61 return Q.front->next->data; 62 } 63 64 void Cancel(LinkQueue &Q) 65 { 66 delete Q.rear; 67 delete Q.front; 68 } 69 70 int main() 71 { 72 LinkQueue Q; 73 int n,a; 74 while(cin>>n) 75 { 76 InitQueue(Q); 77 for(int i=0; i<n; ++i) 78 { 79 cin>>a; 80 EnQueue(Q,a);//入队 81 } 82 83 while(!QueueEmpty(Q)) 84 { 85 cout<<GetQueue(Q)<<' ';//出队 86 DeQueue(Q);//删除队顶元素 87 } 88 cout<<endl; 89 } 90 Cancel(Q); 91 return 0; 92 }
因为是数据结构是实验,所以写的比较简单,以后有时间再写个详细的。