데이터 구조 (1) 스 택 의 사용자 정의 구현
12619 단어 데이터 구조
개요:
동적 으로 조정 할 수 있 는 범 형 스 택 유형 을 사용자 정의 하고 좋 은 성능 을 유지 할 수 있 습 니 다.
실현:
1. 먼저 우리 가 실현 한 것 은 일종 의 정 용 범 형 스 택 유형 이다. 이런 스 택 을 만 든 후에 크기 가 고정 되 어 쉽게 실현 된다.
public class FixedCapacityStack<T>
{
private T[] a;
private int N;
public FixedCapacityStack(int cap)
{
a = new T[cap];
}
public bool isEmpty()
{
return N == 0;
}
public int Size()
{
return N;
}
public void Push(T item)
{
a[N++] = item;
}
public T Pop()
{
return a[--N];
}
}
이 C\# 코드 는 일반적인 스 택 을 성공 적 으로 실현 하 였 으 나 그 용량 은 고정 되 어 있 으 며 그의 크기 가 용량 보다 훨씬 작 거나 크 면 메모리 자원 의 낭비 와 이상 을 초래 할 수 있 습 니 다.이것 은 우리 에 게 가 변 적 이 고 유연 한 스 택 유형 을 실현 하도록 요구한다.
2. 다음 에 우 리 는 가 변 적 인 스 택 유형 을 실현 하면 우 리 는 동적 으로 크기 를 조정 할 수 있 습 니 다.
public class FixedCapacityStack<T>
{
private T[] a;
private int N;
public FixedCapacityStack(int cap)
{
a = new T[cap];
}
public bool isEmpty()
{
return N == 0;
}
public void Resize(int max)
{
T[] temp = new T[max];
for (int i = 0; i < a.Length; i++)
temp[i] = a[i];
a = temp;
}
public int Size()
{
return N;
}
public void Push(T item)
{
if (N == a.Length) Resize(2 * a.Length);
a[N++] = item;
}
public T Pop()
{
T item= a[--N];
if (N>0&&N == a.Length / 4) Resize(a.Length / 2);
return item;
}
}
3. 교체 가능 한 스 택 유형 을 계속 실현 하고 디자인 의도 에 따라 스 택 유형 교체 의 특성 을 실현 할 수 있다. public class FixedCapacityStack
{ private T[] a; private int N; public FixedCapacityStack(int cap) { a = new T[cap]; } public bool isEmpty() { return N == 0; } public void Resize(int max) { T[] temp = new T[max]; int min=Min(a.Length,temp.Length); for (int i = 0; i < min; i++) temp[i] = a[i]; a = temp; } public int Min(int x, int y) { if (x < y) return x; else return y; } public int Size() { return N; } public void Push(T item) { if (N == a.Length) Resize(2 * a.Length); a[N++] = item; } public T Pop() { T item= a[--N];
a[N]=null; if (N>0&&N == a.Length / 4) Resize(a.Length / 2); return item; } public IEnumerator GetEnumerator() { for (int i = a.Length-1; i >=0; i--) { yield return a[i]; } } }
응용: 우 리 는 실제 호출 을 통 해 실제 운행 효 과 를 테스트 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
class Program
{
static void Main(string[] args)
{
/* string testExpress = "(1+((2+3)*(4*5)))";
Console.WriteLine(Evaluate(testExpress));*/
FixedCapacityStack<string> s = new FixedCapacityStack<string>(100);
for (int i = 0; i < 150; i++) s.Push(i.ToString());
Console.WriteLine(s.Size());
for(int j=0;j<120;j++) s.Pop();
foreach (var item in s)
{
Console.WriteLine(item);
}
Console.WriteLine(s.Size());
}
}
이로써 우 리 는 교체 가능 한 가 변 적 인 모델 스 택 유형 을 실현 했다. 이렇게 해서 스 택 유형 을 이해 하고 사용 하면 더욱 뚜렷 한 인식 을 가 질 것 이다.
class Program
{
static void Main(string[] args)
{
/* string testExpress = "(1+((2+3)*(4*5)))";
Console.WriteLine(Evaluate(testExpress));*/
FixedCapacityStack<string> s = new FixedCapacityStack<string>(100);
for (int i = 0; i < 150; i++) s.Push(i.ToString());
Console.WriteLine(s.Size());
for(int j=0;j<120;j++) s.Pop();
foreach (var item in s)
{
Console.WriteLine(item);
}
Console.WriteLine(s.Size());
}
}
여기 서 질문 이 있 습 니 다. 범례 배열 은 그 값 을 null 로 바 꿀 수 없 습 니까?이렇게 하면 팝 이 풀 리 지 않 습 니 다. 여러분, 해결 방법 이 있 으 시 면 아래 댓 글 에서 말씀 해 주 셔 도 됩 니 다. 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.