如何在不丢失其他值的情况下替换堆栈中的值?

时间:2017-08-22 10:56:02

标签: c#

假设我在堆栈中的堆栈中添加了5个值

student1.grades.Push(60);
student1.grades.Push(70);
student1.grades.Push(80);
student1.grades.Push(90);
student1.grades.Push(100);

我想在堆栈中替换第三个值而不会丢失上述两个值。 尝试if条件在堆栈中找到值但是没有找到堆栈中的任何方法来替换它。

if (student1.grades.Contains(80)==true)
{
     // Unsure what to do here.
}

2 个答案:

答案 0 :(得分:2)

为了替换堆栈数据结构中的单个值,您可以使用此算法:

输入是原始堆栈,让我们调用此堆栈

  1. 准备一个临时堆栈,该堆栈开始为空,让我们调用此TEMP
  2. 我们可以从STACK中弹出一个值吗?
    1. 如果不是,请转到步骤5
  3. 从STACK中弹出单个值
  4. 这是我们要替换的价值吗?
    1. 如果是,请将我们要替换的值推回到STACK并转到步骤5
    2. 如果没有,请将其推入TEMP并返回步骤2
  5. 将TEMP中的所有值推回到STACK
  6. 这将完成我在您的问题评论中所说的内容:弹出要替换的值之上的所有值,弹出值,推回新值,推回之前弹出的所有值。

    这是Stack<T>的C#扩展方法,可以实现您的目标:

    public static class StackExtensions
    {
        public static void Replace<T>(this Stack<T> stack, T valueToReplace, T valueToReplaceWith, IEqualityComparer<T> comparer = null)
        {
            comparer = comparer ?? EqualityComparer<T>.Default;
    
            var temp = new Stack<T>();
            while (stack.Count > 0)
            {
                var value = stack.Pop();
                if (comparer.Equals(value, valueToReplace))
                {
                    stack.Push(valueToReplaceWith);
                    break;
                }
                temp.Push(value);
            }
    
            while (temp.Count > 0)
                stack.Push(temp.Pop());
        }
    }
    

    你会这样称呼:

    student1.grades.Replace(80, 85);
    

答案 1 :(得分:0)

看起来你不想使用堆栈,而是想要使用List或者词典......

例如,如果有两个标记80怎么办?你怎么知道要删除哪一个?

你可能想拥有;

Dictionary<String, int> MarksBySubject

然后你可以这样做;

MarksBySubject.Add("Maths", 80);

并删除它;

MarksBySubjects.Remove("Maths");