7-22 堆栈模拟队列 (25分)

没注意看题,一开始把元素类型弄成char了,搞了好久都AC不了,换成int一次就AC了。

题意:

即用两个栈来模拟队列,使两个栈协作实现队列的功能。

思路:

1.第一个栈为输入栈,第二个栈为输出栈,输入栈比输出栈要小。

2.栈满条件:输入栈满了而输出栈不为空,说明栈满了,因为输出栈还有元素的话,输入栈的元素是不能搬到输出栈的,这样会造成顺序混乱(输出栈为空时连续多次将对个输入栈栈顶元素搬到输出栈这一情况除外)。

3.所以说,输入栈的元素要搬到栈顶只能在一种条件下:就是输出栈为空时,且输入栈元素必须一次性地全部搬到输出栈。

此外出栈入栈函数的形参要用指针型,刚开始没注意,就出错了。

  1 #include <iostream>
  2 #include <string>
  3 #include <cstring>
  4 using namespace std;
  5 int n1, n2;
  6 typedef int ElementType;
  7 struct Stack
  8 {
  9     int* s;
 10     int max_;
 11     int r;
 12 };
 13 int IsFull(Stack* S)
 14 {
 15     if (S->r == S->max_ - 1)
 16     {
 17
 18         return 1;
 19     }
 20     else return 0;
 21 }
 22 int IsEmpty(Stack* S)
 23 {
 24     if (S->r == -1)
 25     {
 26         return 1;
 27     }
 28     else return 0;
 29 }
 30 void Push(Stack* S, ElementType item)
 31 {
 32     if (!IsFull(S))
 33     {
 34         S->s[++(S->r)] = item;
 35     }
 36     else return;
 37 }
 38 ElementType Pop(Stack* S)
 39 {
 40     return S->s[(S->r)--];
 41 }
 42 int main()
 43 {
 44     int n1, n2;
 45     Stack* s1=new Stack, *s2=new Stack;
 46     s1->r = -1;
 47     s2->r = -1;
 48     cin >> n1 >> n2;
 49     if (n2 > n1)
 50     {
 51         s1->max_ = n1;
 52         s1->s = new int[n1];
 53         s2->max_ = n2;
 54         s2->s = new int[n2];
 55     }
 56     else
 57     {
 58         s1->max_ = n2;
 59         s1->s = new int[n2];
 60         s2->max_ = n1;
 61         s2->s = new int[n1];
 62     }
 63     while (1)
 64     {
 65         char ch;
 66         cin >> ch;
 67         if (ch == ‘T‘)
 68             break;
 69         else if (ch == ‘A‘)
 70         {
 71             int n;
 72             cin >> n;
 73             if (IsFull(s1))
 74             {
 75                 if (!IsEmpty(s2))
 76                     cout << "ERROR:Full" << endl;
 77                 else
 78                 {
 79                     while (!IsEmpty(s1) && !IsFull(s2))
 80                     {
 81                         Push(s2, Pop(s1));
 82                     }
 83                     Push(s1, n);
 84                 }
 85             }
 86             else
 87                 Push(s1, n);
 88         }
 89         else if (ch == ‘D‘)
 90         {
 91             if (IsEmpty(s2) && IsEmpty(s1))
 92             {
 93                 cout << "ERROR:Empty" << endl;
 94             }
 95             else if (!IsEmpty(s2) && !IsEmpty(s1))
 96             {
 97                 cout << Pop(s2) << endl;
 98             }
 99             else if(IsEmpty(s1))
100             {
101                 cout << Pop(s2) << endl;
102             }
103             else if (IsEmpty(s2))
104             {
105                 while(!IsEmpty(s1) && !IsFull(s2))
106                 {
107                     Push(s2, Pop(s1));
108                 }
109                 cout << Pop(s2) << endl;
110
111             }
112         }
113     }
114
115     return 0;
116 }
  1 #include <iostream>
  2 #include <string>
  3 #include <cstring>
  4 using namespace std;
  5 int n1, n2;
  6 typedef int ElementType;
  7 struct Stack
  8 {
  9     int* s;
 10     int max_;
 11     int r;
 12 };
 13 int IsFull(Stack* S)
 14 {
 15     if (S->r == S->max_ - 1)
 16     {
 17
 18         return 1;
 19     }
 20     else return 0;
 21 }
 22 int IsEmpty(Stack* S)
 23 {
 24     if (S->r == -1)
 25     {
 26         return 1;
 27     }
 28     else return 0;
 29 }
 30 void Push(Stack* S, ElementType item)
 31 {
 32     if (!IsFull(S))
 33     {
 34         S->s[++(S->r)] = item;
 35     }
 36     else return;
 37 }
 38 ElementType Pop(Stack* S)
 39 {
 40     return S->s[(S->r)--];
 41 }
 42 int main()
 43 {
 44     int n1, n2;
 45     Stack* s1=new Stack, *s2=new Stack;
 46     s1->r = -1;
 47     s2->r = -1;
 48     cin >> n1 >> n2;
 49     if (n2 > n1)
 50     {
 51         s1->max_ = n1;
 52         s1->s = new int[n1];
 53         s2->max_ = n2;
 54         s2->s = new int[n2];
 55     }
 56     else
 57     {
 58         s1->max_ = n2;
 59         s1->s = new int[n2];
 60         s2->max_ = n1;
 61         s2->s = new int[n1];
 62     }
 63     while (1)
 64     {
 65         char ch;
 66         cin >> ch;
 67         if (ch == ‘T‘)
 68             break;
 69         else if (ch == ‘A‘)
 70         {
 71             int n;
 72             cin >> n;
 73             if (IsFull(s1))
 74             {
 75                 if (!IsEmpty(s2))
 76                     cout << "ERROR:Full" << endl;
 77                 else
 78                 {
 79                     while (!IsEmpty(s1) && !IsFull(s2))
 80                     {
 81                         Push(s2, Pop(s1));
 82                     }
 83                     Push(s1, n);
 84                 }
 85             }
 86             else
 87                 Push(s1, n);
 88         }
 89         else if (ch == ‘D‘)
 90         {
 91             if (IsEmpty(s2) && IsEmpty(s1))
 92             {
 93                 cout << "ERROR:Empty" << endl;
 94             }
 95             else if (!IsEmpty(s2) && !IsEmpty(s1))
 96             {
 97                 cout << Pop(s2) << endl;
 98             }
 99             else if(IsEmpty(s1))
100             {
101                 cout << Pop(s2) << endl;
102             }
103             else if (IsEmpty(s2))
104             {
105                 while(!IsEmpty(s1) && !IsFull(s2))
106                 {
107                     Push(s2, Pop(s1));
108                 }
109                 cout << Pop(s2) << endl;
110
111             }
112         }
113     }
114
115     return 0;
116 }

原文地址:https://www.cnblogs.com/2020R/p/12427498.html

时间: 2024-11-05 13:27:58

7-22 堆栈模拟队列 (25分)的相关文章

3-08. 堆栈模拟队列(25)(ZJU_PAT 模拟)

题目链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: (1) int IsFull(Stack S):判断堆栈S是否已满,返回1或0: (2) int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0: (3) void Push(Stack S, ElementType item ):将元素item压入堆栈S: (4)

7-22 堆栈模拟队列

7-22 堆栈模拟队列(25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0: int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0: void Push(Stack S, ElementType item ):将元素item压入堆栈S: ElementType Pop(Stack S ):删除并返回S的栈顶元素. 实现队

PTA-7-22 堆栈模拟队列

本题考点:采用堆栈模拟队列 目录 解题思路 情况分析 代码实现 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0: int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0: void Push(Stack S, ElementType item ):将元素item压入堆栈S: ElementType Pop(Stack S ):删除

7-18 银行业务队列简单模拟(25 分)

设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列.假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出. 输入格式: 输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号.编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口.数字间以空格分隔. 输出格式: 按业务处理完成的

7-1 银行业务队列简单模拟 (25 分)

题目: 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列.假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出. 输入格式: 输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号.编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口.数字间以空格分隔. 输出格式: 按业务处

《模拟队列或堆栈》

1 package cn.itcast.api.b.list.subclass; 2 3 import java.util.LinkedList; 4 5 public class LinkedListTest { 6 7 public static void main(String[] args) { 8 /* 9 * 面试题:用LinkedList模拟一个堆栈或者队列数据结构. 10 * 创建一个堆栈或者队列数据结构对象.该对象中是使用LinkedList来完成的. 11 * 12 */ 1

【Java学习笔记】&lt;集合框架&gt;使用LinkedList来模拟一个堆栈或者队列的数据结构

1 import java.util.LinkedList; 2 3 public class Test5 { 4 5 public static void main(String[] args) { 6 7 Duilie dl = new Duilie(); 8 9 dl.myAdd("abc1"); 10 dl.myAdd("abc2"); 11 dl.myAdd("abc3"); 12 dl.myAdd("abc4");

Java集合框架之LinkedList-----用LinkedList模拟队列和堆栈

LinkedList的特有方法: (一)添加方法 addFisrt(E e):将指定元素插入此列表的开头.//参数e可以理解成Object对象,因为列表可以接收任何类型的对象,所以e就是Object对象(传递过程即向上转型). addLast(E e):将指定元素插入此列表的结尾. JDK1.6之后: offerFirst(); offerLast();//其实前后的用法相同,换了一个名字而已. (二):获取元素方法(获取过程不删除链表元素): getFirst();返回此列表的第一个元素.如果

【Weiss】【第03章】练习3.25:数组模拟队列

[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空间有限,入队需要检测数组是否已经满 ②.数组经过几次操作后,rear可能绕回front前面,所以许多操作都要用模来实现. 测试代码: 1 #include <iostream> 2 #include "queue.h" 3 using namespace std; 4 usin