using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int[] train = new int[] { 5, 8, 1, 7, 4, 2, 9, 6, 3 };
//定义三个缓冲轨
LinkStack<int>[] H = new LinkStack<int>[3];
H[0] = new LinkStack<int>();
H[1] = new LinkStack<int>();
H[2] = new LinkStack<int>();
int num = 1; //当前要进入铁轨的车厢号
int minT = 10; //缓冲轨中编号最小的车厢
int staynum = 0; //minT车厢对应的缓冲轨
for (int j = 8; j <= 0; j--)
{
if (minT != num)
{
if (train[j] == num) //将车厢移入铁轨
{
Console.WriteLine("将车厢{0}移入铁轨", train[j]);
num++;
}
else //将车厢移入缓冲轨
{
Hold(train[j], ref minT, ref staynum, ref H, 3, 9);
}
}
else //将车厢从缓冲轨移入铁轨
{
Output(ref minT, ref staynum, ref H, 3, 9);
} }
} //将车厢放入缓冲轨并且修改minT和staynum值
public static void Hold(int c, ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
{
int x; //车厢索引
int Besttrain = n + 1; //用来寻找最优缓冲轨
int num = 0;
for (int i = 0; i < k; i++)
{
if (!H[i].IsEmpty()) //缓冲轨不为空
{
x = H[i].StackTop; //栈顶元素
if (c < x && x <= minT)
{
Besttrain = i;
staynum = Besttrain;
minT = x;
num = 1;
}
}
else
{
Besttrain = i;
num = 1;
break;
}
}
if (num == 0)
{
Console.WriteLine("无可用缓冲轨,需添加缓冲轨");
}
else
{
H[Besttrain].Push(c);
Console.WriteLine("将车厢{0}移入缓冲轨{1}", c, Besttrain + 1);
}
}
//将车厢从缓冲轨移入铁轨并修改minT和staynum值
public static void Output(ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
{
//for(int i=1;i<=k;i++)
Console.WriteLine("将缓冲轨{0}顶部车厢{1}移入铁轨", staynum, minT);
H[staynum].Pop();
minT =H[0].StackTop ;
staynum = 0;
for (int i = 0; i < k-1; i++)
{
if (minT > H[i + 1].StackTop)
{
minT = H[i + 1].StackTop;
staynum = i + 1;
}
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int[] train = new int[] { 5, 8, 1, 7, 4, 2, 9, 6, 3 };
//定义三个缓冲轨
LinkStack<int>[] H = new LinkStack<int>[3];
H[0] = new LinkStack<int>();
H[1] = new LinkStack<int>();
H[2] = new LinkStack<int>();
int num = 1; //当前要进入铁轨的车厢号
int minT = 10; //缓冲轨中编号最小的车厢
int staynum = 0; //minT车厢对应的缓冲轨
for (int j = 8; j <= 0; j--)
{
if (minT != num)
{
if (train[j] == num) //将车厢移入铁轨
{
Console.WriteLine("将车厢{0}移入铁轨", train[j]);
num++;
}
else //将车厢移入缓冲轨
{
Hold(train[j], ref minT, ref staynum, ref H, 3, 9);
}
}
else //将车厢从缓冲轨移入铁轨
{
Output(ref minT, ref staynum, ref H, 3, 9);
} }
} //将车厢放入缓冲轨并且修改minT和staynum值
public static void Hold(int c, ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
{
int x; //车厢索引
int Besttrain = n + 1; //用来寻找最优缓冲轨
int num = 0;
for (int i = 0; i < k; i++)
{
if (!H[i].IsEmpty()) //缓冲轨不为空
{
x = H[i].StackTop; //栈顶元素
if (c < x && x <= minT)
{
Besttrain = i;
staynum = Besttrain;
minT = x;
num = 1;
}
}
else
{
Besttrain = i;
num = 1;
break;
}
}
if (num == 0)
{
Console.WriteLine("无可用缓冲轨,需添加缓冲轨");
}
else
{
H[Besttrain].Push(c);
Console.WriteLine("将车厢{0}移入缓冲轨{1}", c, Besttrain + 1);
}
}
//将车厢从缓冲轨移入铁轨并修改minT和staynum值
public static void Output(ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
{
//for(int i=1;i<=k;i++)
Console.WriteLine("将缓冲轨{0}顶部车厢{1}移入铁轨", staynum, minT);
H[staynum].Pop();
minT =H[0].StackTop ;
staynum = 0;
for (int i = 0; i < k-1; i++)
{
if (minT > H[i + 1].StackTop)
{
minT = H[i + 1].StackTop;
staynum = i + 1;
}
}
}
}
}
解决方案 »
- socket心跳求助
- 郁闷~~~~~~~~C#获取相对路径
- 我写了个批量删除的方法,但是不好用,谁给我看一下。
- 请问固定listview列宽有什么好方法?
- 新手入门DATAGRIDVIEW如何定位一行记录,修改列值,按回车保存到数据库
- 天堂有没加班--------面对痛失亲友的噩耗 还要掩饰??
- 求救啊,寻c#.net(CHM手册一份).
- 为什么不能修改呢?
- 请教:如何使用c#做一个浏览器?
- 简单问题,对变量声明的问题?
- 关于套接字编程的改进,我这个只能交互一次,还有服务器无法理解客户端的私自离开,我做了好多天,新手弄不懂,麻烦懂得改进一下,谢谢谢谢。
- Process.Start在窗体应用程序中好使,但在服务中就无效果。
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{
public class LinkStack<T> : IStack<T> where T : IComparable<T>
{
private readonly SLinkList<T> _lst;
public LinkStack()
{
_lst = new SLinkList<T>();
}
public int Length
{
get { return _lst.Length; }
}
public T StackTop
{
get
{
if (_lst.Length == 0)
throw new Exception("栈为空");
return _lst[0];
}
}
public void Push(T data)
{
_lst.InsertAtFirst(data);
}
public void Pop()
{
if (_lst.Length == 0)
throw new Exception("栈为空");
_lst.Remove(0);
}
public bool IsEmpty()
{
return _lst.IsEmpty();
}
public void Clear()
{
_lst.Clear();
}
}
}
代码不全如何帮你测试?
要是我帮你写,怎没能知道你的问题在哪里呢?
static void Main(string[] args)
{
int[] train = new int[] { 5, 8, 1, 7, 4, 2, 9, 6, 3 };
//定义三个缓冲轨
Stack<int>[] H = new Stack<int>[3];
H[0] = new Stack<int>();
H[1] = new Stack<int>();
H[2] = new Stack<int>();
int num = 1; //当前要进入铁轨的车厢号
int minT = 10; //缓冲轨中编号最小的车厢
int staynum = 0; //minT车厢对应的缓冲轨
for (int j = 8; j >= 0; j--)
{
if (minT != num)
{
if (train[j] == num) //将车厢移入铁轨
{
Console.WriteLine("将车厢{0}移入铁轨", train[j]);
num++;
}
else //将车厢移入缓冲轨
{
Hold(train[j], ref minT, ref staynum, ref H, 3, 9);
}
}
else //将车厢从缓冲轨移入铁轨
{
Output(ref minT, ref staynum, ref H, 3, 9);
} }
} //将车厢放入缓冲轨并且修改minT和staynum值
public static void Hold(int c, ref int minT, ref int staynum, ref Stack<int>[] H, int k, int n)
{
int x; //车厢索引
int Besttrain = n + 1; //用来寻找最优缓冲轨
int num = 0;
for (int i = 0; i < k; i++)
{
if (H[i].Count > 0) //缓冲轨不为空
{
x = H[i].Peek(); //栈顶元素
if (c < x && x <= minT)
{
Besttrain = i;
staynum = Besttrain;
minT = x;
num = 1;
}
}
else
{
Besttrain = i;
num = 1;
break;
}
}
if (num == 0)
{
Console.WriteLine("无可用缓冲轨,需添加缓冲轨");
}
else
{
H[Besttrain].Push(c);
Console.WriteLine("将车厢{0}移入缓冲轨{1}", c, Besttrain + 1);
}
}
//将车厢从缓冲轨移入铁轨并修改minT和staynum值
public static void Output(ref int minT, ref int staynum, ref Stack<int>[] H, int k, int n)
{
//for(int i=1;i<=k;i++)
Console.WriteLine("将缓冲轨{0}顶部车厢{1}移入铁轨", staynum, minT);
H[staynum].Pop();
minT =H[0].Peek() ;
staynum = 0;
for (int i = 0; i < k-1; i++)
{
if (minT > H[i + 1].Peek())
{
minT = H[i + 1].Peek();
staynum = i + 1;
}
}
}
}当然你套用 C++ 代码自己定义一个 LinkStack 也是可以的,但一定要严格测试,确保没有问题才行我不敢说你的 LinkStack 就一定有问题
但是将
for (int j = 8; j >= 0; j--)
写成
for (int j = 8; j <= 0; j--)
这样的逻辑错误都发现不了的话,你的那个 LinkStack 谁还敢用?