我正在堆栈,我有一个输入框,每当我输入一个数字,该数字被插入堆栈,并显示在标签中,我不断添加数字和标签,然后每当我弹出一个数字,最后创建的标签(代表堆栈)需要消失等等,直到堆栈为空。
简而言之,我在堆栈中添加了一个数字,创建了一个标签,我弹出一个数字,相应的标签就消失了。
我的问题是,每当我不断弹出数字时,唯一消失的标签是最后一个,其他标签不会消失。
让我们说这些是我的标签
8 7 6 五 4 3 2 1
我弹出8 7 6 5 ...而唯一消失的标签是最后一个,编号8
7 6 五 4 3 2 1
以下是我创建标签的代码
if (token != "+" && token != "-" && token != "*" && token != "/")
{
problem.push(Convert.ToDouble(token));
lstbxStack.Items.Add("Pushed: " + token);
MessageBox.Show("Pushed: " + token);
lblPush = new Label();
lblPush.BorderStyle = BorderStyle.Fixed3D;
lblPush.Location = new Point(290, labelY);
lblPush.Name = "lblPush";
lblPush.Size = new Size(100, 20);
lblPush.Text = token;
Controls.Add(lblPush);
lblPush.BringToFront();
labelY -= 21;
}
这是我隐藏标签的地方
operand2 = problem.pop();
.
.
lblPush.Hide();
operand1 = problem.pop();
.
.
lblPush.Hide();
这是在for
循环和switch
个案例
由于
答案 0 :(得分:0)
问题似乎是在弹出一个元素后,lblPush
需要引用与堆栈上 now 最顶层项目相关联的标签,以便 next 弹出操作将隐藏正确的标签。但是我没有观察到lblPush
在“pop”操作之后的重新分配,所以我假设它在当前代码中,这个变量总是指的是最后一个项被推送到堆栈上,而不是堆栈的 top 上的项目,这是我认为你需要的。
执行此操作的一种方法是将操作数与堆栈本身中的标签相关联。
例如:
Stack<Tuple<double, Label>> problem = ..
//Push:
double operand = ..
Label label = ..
problem.Push(Tuple.Create(operand, label));
...
//Pop:
var tuple = problem.Pop();
double operand = tuple.Item1;
Label label = tuple.Item2;
label.Hide();
您当然可以依赖ControlCollection
本身的标签顺序,但我不建议这样做。或者,您可以提出更多MVC,但对于像这样的孤立问题,Tuple
解决方案很好,IMO。
答案 1 :(得分:0)
类似的东西:
Controls.OfType<Label>().Where(...).ToList().ForEach(l => l.Hide());
在Where中,你应该对标签的名称有一个条件,但为此你需要给每个人一个特定的名字。
答案 2 :(得分:0)
我建议保持一堆数字和一堆Label
控件,并同步他们的推/弹。或者,您可以创建一个包含数字和标签的类,并使用一个堆栈 - 这将大大减少要维护的代码量。像这样:
public class NumberLabel
{
public int Number { get; set; }
public Label Label { get; set; }
}
...
var stack = new Stack<NumberLabel>();