Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Код на c# неправильно работает

Алена Ученик (90), на голосовании 1 год назад
Я сделала визуализацию стека на односвязном списке. то есть есть 3 кнопки clear, push и pop. Все работает нормально, но при нажатии на кнопку pop удаляются либо все элементы, либо пишет что стек пуст. Стек заполнен, элементы передаются в консолы нормально, стек обновляется. Помогите, пожалуйста, исправить. Скидываю часть кода

public partial class Form1 : Form
{
private List<int> stack = new List<int>(); // Односвязный список для хранения стека
private const int itemSize = 25; // Размер элемента стека
private const int spacing = 10; // Расстояние между элементами
private Point stackLocation = new Point(30, 30); // Координаты верхнего элемента стека
private const int maxItems = 10; // Максимальное количество элементов в стеке
 private void UpdateStack()   

{

panel1.Controls.Clear();

for (int i = 0; i < stack.Count; i++)

{

Panel cell = new Panel();

cell.Size = new Size(itemSize, itemSize);

cell.Location = new Point(stackLocation.X, stackLocation.Y + i * (itemSize + spacing));

cell.BorderStyle = BorderStyle.FixedSingle;



Label label = new Label();

label.Text = stack[i].ToString();

label.Size = new Size(itemSize, itemSize);

label.BorderStyle = BorderStyle.FixedSingle;

label.TextAlign = ContentAlignment.MiddleCenter;

label.Location = new Point(0, 0);

cell.Controls.Add(label);



panel1.Controls.Add(cell);

}

}







private void textBox1_TextChanged(object sender, EventArgs e)

{



}







private void panel1_Paint(object sender, PaintEventArgs e)



{



// Очищаем панель отображения стека



// Отображаем каждый элемент стека на панели

int index = 0;

int maxItemsToDisplay = 10; // Задаем максимальное количество ячеек для отображения

if (stack.Count > maxItemsToDisplay)

{

index = stack.Count - maxItemsToDisplay; // Вычисляем индекс первой ячейки для отображения

}

for (int i = index; i < stack.Count; i++)

{

Label label = new Label();

label.Text = stack[i].ToString();

label.Size = new Size(itemSize, itemSize);

label.BorderStyle = BorderStyle.FixedSingle;

label.TextAlign = ContentAlignment.MiddleCenter;

label.Location = new Point(stackLocation.X, stackLocation.Y + (i - index) * (itemSize + spacing));

panel1.Controls.Add(label);

UpdateStack();

}

}

//кнопка удаления

private void button3_Click(object sender, EventArgs e)
{
if (stack.Count == 0)
{
MessageBox.Show("Stack is empty.");
}
else
{
stack.RemoveAt(stack.Count - 1);
UpdateStack();
}
}
Голосование за лучший ответ
Ilya Hämäläinen Мастер (1276) 1 год назад
 public partial class Form1 : Form 
{
private List stack = new List();
private const int itemSize = 25;
private const int spacing = 10;
private Point stackLocation = new Point(30, 30);
private const int maxItems = 10;

private void UpdateStack()
{
panel1.Controls.Clear();

for (int i = 0; i < stack.Count; i++)
{
Panel cell = new Panel();
cell.Size = new Size(itemSize, itemSize);
cell.Location = new Point(stackLocation.X, stackLocation.Y + i * (itemSize + spacing));
cell.BorderStyle = BorderStyle.FixedSingle;

Label label = new Label();
label.Text = stack[i].ToString();
label.Size = new Size(itemSize, itemSize);
label.BorderStyle = BorderStyle.FixedSingle;
label.TextAlign = ContentAlignment.MiddleCenter;
label.Location = new Point(0, 0);
cell.Controls.Add(label);

panel1.Controls.Add(cell);
}
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
int index = 0;
int maxItemsToDisplay = 10;

if (stack.Count > maxItemsToDisplay)
{
index = stack.Count - maxItemsToDisplay;
}

for (int i = index; i < stack.Count; i++)
{
Label label = new Label();
label.Text = stack[i].ToString();
label.Size = new Size(itemSize, itemSize);
label.BorderStyle = BorderStyle.FixedSingle;
label.TextAlign = ContentAlignment.MiddleCenter;
label.Location = new Point(stackLocation.X, stackLocation.Y + (i - index) * (itemSize + spacing));
panel1.Controls.Add(label);
}
}

private void button1_Click(object sender, EventArgs e)
{
stack.Clear();
UpdateStack();
}

private void button2_Click(object sender, EventArgs e)
{
if (stack.Count < maxItems)
{
int num = 0;
if (!int.TryParse(textBox1.Text, out num))
{
MessageBox.Show("Invalid input. Please enter an integer.");
return;
}
stack.Add(num);
UpdateStack();
}
else
{
MessageBox.Show("Stack is full.");
}
}

private void button3_Click(object sender, EventArgs e)
{
if (stack.Count == 0)
{
MessageBox.Show("Stack is empty.");
}
else
{
stack.RemoveAt(stack.Count - 1);
UpdateStack();
}
}
}
визуализация стека на односвязном списке, тьфу, и готово
Похожие вопросы