스택은 자료 구조 공부를 하면서 제일 많이 듣는 내용인 것 같다

스택이란 ?  제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다.

스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조로 되어 있다. 자료를 넣는 것을 '밀어넣는다' 하여 푸시(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 (pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 된다. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다.

 





참고 자료 및 소스 출처:

1. 위키
저작자 표시 비영리
신고
posted by 몰라용
이중 연결 리스트의 구조는 단순 연결 리스트와 비슷하지만, 포인터 공간이 두 개가 있고 각각의 포인터는 앞의 노드와 뒤의 노드를 가리킨다


public class CLinkedList {
	
	private ListNode head = null;
	
	public CLinkedList(){
		this.head = null;
	}

	public void insertFirstNode(String data){
		ListNode newNode = new ListNode(data);
		if(this.head == null){
			this.head = newNode;
			this.head.link = head;
		}else{
			ListNode temp = this.head;
			while(temp.link != head){
				temp = temp.link;
			}
			
			newNode.link = temp.link;
			this.head = newNode;
			temp.link = newNode;
		}
		
	}
	
	
	public void insertMiddleNode(ListNode pre, String data){
		ListNode newNode = new ListNode(data);
		newNode.link = pre.link;
		pre.link = newNode;
	}
	
	
	public void insertLastNode(String data){
		ListNode newNode = new ListNode(data);
		if(head == null){
			this.head = newNode;
			this.head.link = head;
		}else{
			ListNode temp = head;
			while(temp.link != head) temp = temp.link;
			temp.link = newNode;
			newNode.link = head;
		}
	}
	
	public void deleteLastNode(){
		ListNode pre, temp;
		if(head == null) return ;
		if(head.link == null){
			head = null;
		}else{
			pre = head;
			temp = head.link;
			while(temp.link != head){
				pre =temp;
				temp = temp.link;
			}
			pre.link = head;
		}
	}
	
	public ListNode searchNode(String data){
		ListNode temp = this.head;
		while(temp.link != head && temp != null){
			if(data == temp.getData()) return temp;
			else temp = temp.link;
		}
		return temp;
	}
	
	public void printList(){
		ListNode temp = this.head;
		System.out.printf("L =(");
		while(temp != null && temp.link != this.head){
			System.out.printf(temp.getData());
			temp = temp.link;
			if(temp != null && temp.link != this.head){
				System.out.printf(", ");
			}
		}
		System.out.println(")");
	}
	
	
}
public class CLinkedListMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CLinkedList L = new CLinkedList();
		System.out.println("add linkedList");
		L.insertLastNode("1");
		L.insertLastNode("2");
		L.insertLastNode("3");
		L.printList();
		
		System.out.println("add node(first)");
		
		L.insertFirstNode("first");
		L.printList();
		
		System.out.println("add node after 1");
		ListNode pre = L.searchNode("1");
		L.insertMiddleNode(pre, "ex");
		L.printList();
		
		System.out.println("delete");
		L.deleteLastNode();
		L.printList();
		

	}

}

참고 자료 및 소스 출처:

1. 위키
2. http://www.gurubee.net/pages/viewpage.action?pageId=1507898

저작자 표시 비영리
신고
posted by 몰라용
링크드 리스트 중 간단히 구현할 수 있는 단순 연결 리스트 이다

실상.. 간단하지는 않은 내용이다. 중간에 보변 reverse함수 부분은 유심히 보는 편이 좋을 듯 쉽다.

아래 그림은 단순 연결리스트 구조 이다.




class : ListNode
 
public class ListNode {
	
	private String data;
	public ListNode link = null;
	
	public ListNode(){
		this.data = null;
		this.link = null;
	}
	
	
	public ListNode(String data, ListNode node){
		this.data = data;
		this.link = node;
	}

	
	public ListNode(String data){
		this.data = data;
	}
	
	public String getData(){
		return this.data;
	}
	
}
class: LinkedList
 

public class LinkedList {
	
	private ListNode head = null;
	
	public LinkedList(){
		this.head = null;
	}
	
	public void insertFirstNode(String data){
		ListNode newNode = new ListNode(data);
		
		if( this.head == null){
			this.head = newNode;
		}else{
			ListNode tmpListNode = head;
			this.head = newNode;
			newNode.link = tmpListNode;
		}
	}
	
	public void insertMiddleNode(ListNode pre, String data){
		ListNode newNode = new ListNode(data);
		newNode.link = pre.link;
		pre.link = newNode;
	}
	
	public void insertLastNode(String data){
		ListNode newNode = new ListNode(data);
		if(head == null) this.head = newNode;
		else{
			ListNode tmp = head;
			while(tmp.link != null) tmp = tmp.link;
			tmp.link = newNode;
		}
	}
	
	public void deleteLastNode(){
		ListNode pre,temp;
		if(head == null) return ;
		if(head.link == null) head = null;
		else{
			pre = head;
			temp = head.link;
			while(temp.link != null){
				pre = temp;
				temp = temp.link;
			}
			pre.link = null;
		}
	}
	
	public ListNode searchNode(String data){
		ListNode temp = this.head;
		while(temp != null){
			if(data.equals(temp.getData())) return temp;
			else temp = temp.link;
		}
		
		return temp;
	}
	
	public void reverseList(){
		ListNode next = head;
		ListNode current = null;
		ListNode pre = null;
		while(next != null){
			pre = current;
			current = next;
			next = next.link;
			current.link = pre;
		}
		
		head = current;
	}
	
	public void printList(){
		ListNode temp = this.head;
		System.out.printf("L = (");
		while(temp != null){
			System.out.printf(temp.getData());
			temp = temp.link;
			if(temp != null){
				System.out.printf(" ,");
			}
		}
		System.out.println(")");
	}	

}
 class : LinkedListMain
public class LinkedListMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LinkedList L = new LinkedList();
		System.out.println("add linkedList");
		L.insertLastNode("1");
		L.insertLastNode("2");
		L.insertLastNode("3");
		L.printList();
		
		System.out.println("add node(first)");
		L.insertFirstNode("first");
		L.printList();
		
		System.out.println("add node after 1");
		ListNode pre = L.searchNode("1");
		L.insertMiddleNode(pre, "ex");
		L.printList();
		
		System.out.println("reverse");
		L.reverseList();
		L.printList();
		
		System.out.println("delete");
		L.deleteLastNode();
		L.printList();
		

	}

}

실행 결과

 
참고 자료 및 소스 출처:

1. 위키
2. http://www.gurubee.net/pages/viewpage.action?pageId=1507898



저작자 표시 비영리
신고
posted by 몰라용
- 목 적
  개인 실력 향상을 위한 프로젝트

- 기 간
  11. 4.18 ~



- 목 차 
  1. 연결 리스트
     - 단일 연결 리스트 (자바)
     - 이중 연결 리스트 (자바)
  2. 스택

  




- history
2011-4-18  알고리즘 & 자료구조 정리 시작






- 자료 출처 리스트
1.http://ko.wikipedia.org/wiki/%EC%97%B0%EA%B2%B0_%EB%A6%AC%EC%8A%A4%ED%8A%B8#.EB.8B.A8.EC.88.9C_.EC.97.B0.EA.B2.B0_.EB.A6.AC.EC.8A.A4.ED.8A.B8 
2.http://www.gurubee.net/pages/viewpage.action?pageId=1507898
3.뇌를 자극하는 알고리즘
저작자 표시 비영리
신고
posted by 몰라용