- #include <stdio.h>
- #include <stdlib.h>
- typedef int element;
- typedef struct stackNode
- {
- element data; //해당 노드의 값을 가지고 있는 int형 data변수
- struct stackNode* link; // 이전 노드의 주소값을 가지고 있게 될 구조체 포인터 변수
- }stackNode;
- stackNode* top; // 최상위 값을 가지게 되는 포인터 구조체 변수
- stackNode* cur; // 현재 위치값을 가지게 될 포인터 구조체 변수
- stackNode* curprev; // 현재 위치값의 이전값을 가지게 될 구조체 변수
- int flag = 0;
- void push(element num)
- {
- stackNode* temp = (stackNode*)malloc(sizeof(stackNode));
- if(top == NULL) // top이 값이 없는 상태에서 값을 넣으면 flag를 1을 가지게 한다.
- flag = 1;
- temp->data = num; // temp의 data에 입력값을 저장한다.
- temp->link = top; // 이전 노드를 기억 하기위한 link에 현재 top의 위치를 저장시킨다.
- top = temp; // top 구조체 변수에 새로운 top이 될 임시 구조체 변수 temp를 넣는다.
- }
- element pop()
- {
- element n;
- stackNode* temp = top;
- if(top == NULL) // 스택에 값이 없으면
- {
- printf("\nStack is empty\n");
- return 0;
- }
- else
- {
- n = temp->data;
- top = temp->link;
- if(top == NULL) // 스택이 비게되면 flag에 0을 써줘서
- flag = 0; // insert입력시에 잘못된 값을 넣는것을 방지한다.
- free(temp); // 더이상 사용하지 않는 temp변수를 메모리에서 해제시킨다.
- printf("pop Num : %d\n", n);
- return n;
- }
- }
- void printStack()
- {
- stackNode* p = top; // 임시 포인터 구조체변수 p를 선언하여 top의 값을 복사한다.
- printf("\nstack [ ");
- while(p)
- {
- printf("%d ",p->data); // p의 데이터를 출력한다.
- p = p->link; // p의 데이터를 출력후 p를 p의 link값을 가지게 함으로서 앞으로 한칸 가게 한다.
- }
- printf("]\n");
- }
- void search(element num)
- {
- cur = top; // top을 cur변수(위치정보를 가지게 될 변수)에 복사한다.
- curprev = top->link;
- while(cur) // cur가 NULL을 가지게 될때까지
- {
- if(cur->data == num) // 만약 값을 찾게 된다면 반복문을 종료한다.
- {
- return;
- }
- else
- {
- cur = cur->link; // 아니라면 cur의 앞의 노드로 cur를 이동 시킨다.
- curprev = curprev->link;
- }
- }
- printf("not find num\n"); // 값을 찾지 못하면 찾지못하였음을 알리고
- return; // 종료한다.
- }
- void insert(element num)
- {
- stackNode* newnode = (stackNode*)malloc(sizeof(stackNode));
- int val1 = 0;
- if(flag == 0) // 만약에 값이 하나도 없다면 insert가 될수 없으므로
- {
- push(num); // push를 한다.
- }
- else
- {
- printf("Select input position : "); // 삽입할 위치를 알 수 없으므로
- scanf("%d",&val1); // 삽입할 위치를 입력한다.
- search(val1); // 삽입할 위치의 값이 스택에 있는치 찾는다.
- newnode->data = num;
- newnode->link = cur->link;
- cur->link = newnode;
- }
- }
- void del(element num) // 최상위의 값을 지우는 함수
- {
- if(top == NULL) // 만약 스택이 비었으면
- {
- printf("stack is empty\n"); // 메시지 출력수
- return; // 종료한다.
- }
- else
- {
- search(num);
- top = top->link; // 아니라면 top을 한칸 앞으로 이동 시킨다.
- }
- }
- element peek(){ // 최상위, 즉 top의 값을 반환하는 함수이다.
- element item;
- item = top->data; // item에 top의 data를 저장한다.
- return item; // item을 반호나한다.
- }
- element main(int argc, char** argv)
- {
- int num = 0;
- int val = 0;
- while(1)
- {
- printf("select : 1. push, 2.pop, 3.insert, 4. delete, 5. printStack, 0. exit\n");
- printf(" -> ");
- scanf("%d",&num);
- if(num == 1)
- {
- printf("Enter num :");
- scanf("%d", &val);
- push(val);
- }
- else if(num == 2)
- {
- pop();
- }
- else if(num == 3)
- {
- printStack();
- printf("Enter insert Number : ");
- scanf("%d", &val);
- insert(val);
- }
- else if(num == 4)
- {
- printStack();
- printf("Enter delete Number : ");
- scanf("%d", &val);
- del(val);
- }
- else if(num == 5)
- {
- printStack();
- }
- else if(num == 0)
- {
- exit(0);
- }
- else
- {
- printf("That's wrong input");
- }
- }
- }
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
배열 stack / 단순연결리스트 stack (0) | 2009.05.04 |
---|---|
C언어 :: 링크드 리스트 (0) | 2009.04.24 |
[C언어] bit 연산 , 비트 연산 (0) | 2009.04.12 |
링크드 리스트에 정확한 개념 (0) | 2009.04.07 |
C언어 함수 완벽 정리 (0) | 2009.04.04 |