用栈实现队列

  最近补习了一些简单的算法,从头开始学习了数据结构。

  有被人问到一个有意思的题目。就是提供一个有Count属性,Pop 和 Push 方法的Stack类,如何用它完成一个Queue的结构。

  第一次写的时候并不够完美,后来修改成下面的代码并记录下来,希望有大侠能帮忙指出其中不足之处。

  

  欢迎大家前来讨论。

 

 

ExpandedBlockStart.gif 代码
using  System;


namespace  TestQueueWithStack
{
    
public   class  TestStack < T >
    {
        
private   int  _count;  // 栈的总容量

        
private  T[] _data;  // 数组,用于存储栈中的数据元素

        
private   int  point;  // 栈的指针

        
// 栈的总容量
         public   int  Count
        {
            
get  {  return  _count; }
        }
        
// 已经装入的个数
         public   int  Length
        {
            
get
            {
                
return  point  +   1 ;
            }
        }

        
// 构造函数
         public  TestStack( int  count)
        {
            _data 
=   new  T[count];
            _count 
=  count;
            point 
=   - 1 ;
        }

        
// 入栈 Push
         public   void  Push(T item)
        {
            
if  (point.Equals(_count  -   1 ))
            {
                Console.WriteLine(
" Stack is full " );
                
return ;
            }
            _data[
++ point]  =  item;
        }

        
// 出栈
         public  T Pop()
        {
            T temp 
=   default (T);
            
if  (point.Equals( - 1 ))
            {
                Console.WriteLine(
" Stack is empty " );
                
return  temp;  //  超出报错
            }
            temp 
=  _data[point];
            
-- point;
            
return  temp;
        }
    }


    
///   <summary>
    
///  Queue
    
///   </summary>
    
///   <typeparam name="T"></typeparam>
     public   class  TestQueue < T >
    {
        
private  TestStack < T >  _data;  // 主数组,用于存储栈中的数据元素

        
private  TestStack < T >  _aideData;  // 辅助数组,用于暂时存储栈中的数据

        
public   int  Length
        {
            
get
            {
                
return  _data.Length + _aideData.Length;
            }
        }
        
// 构造函数
         public  TestQueue( int  count)
        {
            _data 
=   new  TestStack < T > (count);
            _aideData 
=   new  TestStack < T > (count);
        }

        
// 入队列 Push
         public   void  Push(T item)
        {
            
if  (Length  <  _data.Count)
            {
                _data.Push(item);
            }
            
else
            {
                Console.WriteLine(
" Queue is full " );
            }
        }

        
// 出队列 Pop
         public  T Pop()
        {            
            
if  (_aideData.Length  ==   0 ) // 如果辅助存贮数据的Data为空
            {
                
if (_data.Length == 0 )
                {
                    T temp 
=   default (T);
                    Console.WriteLine(
" Queue is empty " );
                    
return  temp;
                }
                
else
                {
                    
while  (_data.Length  >   0 )
                    {
                        _aideData.Push(_data.Pop());
                    }
                    
return  _aideData.Pop();
                }                
            }
            
else
            {
                
return  _aideData.Pop();
            }
        }
    }
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
            
/* ------------------ 为了说明 TestStack 的Push 和 Pop 方法 ----------------------- */
            
// TestStack<int> stack = new TestStack<int>(10);

            
// int i = 0;
            
// while (i++ < 10)
            
// {
            
//     stack.Push(i);
            
// }

            
// while (stack.Length.CompareTo(0) > 0)
            
// {
            
//     Console.WriteLine(stack.Pop());
            
// }

            
// Console.Read();
             /* ------------------------------------- End ------------------------------------ */

            TestQueue
< int >  queue  =   new  TestQueue < int > ( 10 );

            queue.Pop();
//

            
int  i  =   0 ;
            
while  (i ++   <   11 ) // 故意多放入一个
            {
                queue.Push(i);
            }

            
// 只取出其中一个 理论为 1 2
            Console.WriteLine(queue.Pop());
            Console.WriteLine(queue.Pop());

            
// 压入数字 11 12
            queue.Push( 11 );
            queue.Push(
12 );

            
while  (queue.Length.CompareTo( 0 >   0 )
            {
                Console.WriteLine(queue.Pop());
            }

            Console.Read();
        }
    }
}

另外还有一个问题,想遗留在这,看看大家是否有完美的解决方案

从一个有N个数字的数组中取出 i个最大或最小的数字,唯一条件 N 远大于 i

 

转载于:https://www.cnblogs.com/Zane_Yao/archive/2009/12/24/BuildQueueClassWithStack.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值