데이터 구조 (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:IEnumerable 
 { 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 로 바 꿀 수 없 습 니까?이렇게 하면 팝 이 풀 리 지 않 습 니 다. 여러분, 해결 방법 이 있 으 시 면 아래 댓 글 에서 말씀 해 주 셔 도 됩 니 다. 감사합니다.

좋은 웹페이지 즐겨찾기