我想检索堆栈中输入的最小值(通过push(int))。
以下是我为Push
和Pop
撰写的示例代码,但未能获得最低值
class Program
{
private int StackSize;
public int StackSizeSet
{
get { return StackSize; }
set { StackSize = value; }
}
public int top;
Object[] item;
public Program()
{
StackSizeSet = 10;
item = new Object[StackSizeSet];
top = -1;
}
public void isMinimum()
{
for (int i = 0; i <StackSizeSet; i++)
{
Console.WriteLine("Mianimum value is" + item[top]);
Console.ReadKey();
}
}
public bool isEmpty()
{
if (top == -1) return true;
return false;
}
public void Push(int value)
{
if (top == (StackSize - 1))
{
Console.WriteLine("Stack is full!");
}
else
{
item[++top] = value;
Console.WriteLine("Item pushed successfully!");
Console.WriteLine(item[top]);
}
}
public object Pop()
{
if (isEmpty())
{
Console.WriteLine("Stack is empty!");
Console.ReadLine();
return "No elements";
}
else
{
Console.WriteLine("Items popped successfully");
return item[top--];
}
}
static void Main(string[] args)
{
Program p = new Program();
p.Push(10);
p.Pop();
p.isMinimum();
//Console.WriteLine(p);
Console.ReadKey();
}
}
答案 0 :(得分:2)
除了项目本身,您还应该存储子堆栈的最小值。所以你将拥有:
int[] items;
int[] minima; //initialize in constructor
在Push
上,您可以将最小值添加到堆栈中:
public void Push(int value)
{
if (top == (StackSize - 1))
{
Console.WriteLine("Stack is full!");
}
else
{
item[++top] = value;
if(top == 0)
minima[top] = value;
else
minima[top] = Math.Min(value, minima[top - 1]);
Console.WriteLine("Item pushed successfully!");
Console.WriteLine(item[top]);
}
}
为了计算最小值,您只需要查看最小值堆栈上的最顶层元素,这将为您提供O(1)
时间复杂度而不是O(n)
。
这是一个例子(从下到上的堆栈):
items minima
-------------
1 1
7 2
5 2
2 2
3 3
答案 1 :(得分:1)
所有Minimum
方法都会迭代堆栈中的项目。您可以使用LINQ轻松获得最小值,但如果您想在没有集合的情况下完成它,那么您可以做很长的事情 - 遍历堆栈并保持存储最低值;一旦你完成了堆叠,你就会得到答案。
假设您使用的是int[]
而不是Object[]
(因此我们无需处理演员表):
int minValue = item[0];
for (int i = 1; i <StackSizeSet; i++)
{
if (minValue > item[i])
{
minValue = item[i];
}
}
基本上,上面的代码将最小值设置为等于数组中的第一个元素(堆栈中最旧的元素)。
然后它将遍历其余元素,将当前元素与当前最小值进行比较 - 如果当前元素较低,则将最小值更新为当前值。
循环完成后,您将拥有堆栈的最小值。