선형 표 로 표 시 된 순서 스 택
github 소스 코드 특징: 1. 데이터 구조의 측면 에서 볼 때 스 택 도 선형 표 이 고 그 특수성 은 스 택 의 기본 적 인 조작 은 선형 표 작업 의 부분 집합 이 며 조작 이 제 한 된 선형 표 이다.그러나 데이터 유형의 측면 에서 볼 때 스 택 은 선형 표 와 크게 다른 두 가지 추상 적 인 데이터 유형 이다.2. 스 택 (stack) 은 표 끝 에 만 삽입 하거나 삭제 하 는 선형 표 로 한정 되 어 있 기 때문에 스 택 의 경우 표 끝 에 특별한 의 미 를 가지 고 스 택 지붕 (top) 이 라 고 부 르 고 표 끝 을 스 택 바닥 (bottom) 이 라 고 부른다.3. 스 택 의 수정 은 후진 선 출 의 원칙 에 따라 이 루어 지기 때문에 스 택 은 후진 선 출 (Last in First out) 의 선형 표 (LIFO 구조 로 약칭) 라 고도 부른다.4. 선형 표 와 유사 하고 스 택 에 도 두 가지 저장 표시 방법 이 있 으 며 순서 스 택 과 체인 스 택 이 있다.순서 스 택, 즉 스 택 의 순서 저장 구 조 는 한 그룹의 주소 연속 저장 부 를 이용 하여 스 택 밑 에서 스 택 꼭대기 까지 의 데이터 요 소 를 순서대로 저장 하 는 동시에 포인터 top 을 설치 하여 스 택 꼭대기 요소 가 순서 스 택 에 있 는 위 치 를 표시 합 니 다.5. 스 택 을 사용 하 는 과정 에서 필요 한 최대 공간의 크기 를 예측 하기 어렵 기 때문에 일반적인 상황 에서 빈 스 택 을 초기 화 할 때 스 택 의 최대 용량 을 제한 해 서 는 안 됩 니 다.순서 창고 에 대해 비교적 합 리 적 인 방법 은 먼저 순서 창고 에 기본 용량 을 분배 한 다음 에 응용 과정 에서 창고 의 공간 이 충분 하지 않 을 때 점차적으로 확대 하 는 것 이다.이 를 위해, 상수 두 개 를 설정 할 수 있 습 니 다: STACKINIT_SIZE (저장 공간 초기 분 배 량) 와 STACKINCREMENT (저장 공간 분 배 량 증가).
LinearListStack. c 파일
#include
#include
#include "LinearListStack.h"
//
static void clear(LinearListStack *This);
static int isEmpty(LinearListStack *This);
static int length(LinearListStack *This);
static void risePrint(LinearListStack *This);
static void downPrint(LinearListStack *This);
static int getTop(LinearListStack *This,ElemType* e);
static int push(LinearListStack *This,ElemType* e);
static int pop(LinearListStack *This, ElemType* e);
LinearListStack *InitLinearListStack(){
LinearListStack *L = (LinearListStack *)malloc(sizeof(LinearListStack));
LinearListStack_P *p = (LinearListStack_P *)malloc(sizeof(LinearListStack_P));
p->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
p->top = p->base;
p->length = 0; //
p->size = STACK_INIT_SIZE; //
L->This = p;
L->clear = clear;
L->isEmpty = isEmpty;
L->length = length;
L->risePrint = risePrint;
L->downPrint = downPrint;
L->getTop = getTop;
L->push = push;
L->pop = pop;
return L;
}
void DestroyLinearListStack(LinearListStack *L){
free(L->This);
free(L);
L = NULL;
}
static void clear(LinearListStack *This){
LinearListStack_P *p = This->This;
p->top = p->base;
p->length = 0; //
}
static int isEmpty(LinearListStack *This){
LinearListStack_P *p = This->This;
return (p->length == 0);
}
static int length(LinearListStack *This){
LinearListStack_P *p = This->This;
return p->length;
}
static void risePrint(LinearListStack *This){
LinearListStack_P *p = This->This;
int i;
for (i=0; i < p->length; i++){
printf("%c", *(p->base + i));
}
printf("
");
}
static void downPrint(LinearListStack *This){
LinearListStack_P *p = This->This;
int i;
for (i=0; i < p->length; i++){
printf("%c", *(p->top - 1 - i));
}
printf("
");
}
static int getTop(LinearListStack *This,ElemType* e){
LinearListStack_P *p = This->This;
if (p->top == p->base) return -1;
*e = *(p->top-1);
return 0;
}
static int push(LinearListStack *This,ElemType* e){
LinearListStack_P *p = This->This;
if (p->top - p->base >= p->size){ //
ElemType *newbase = (ElemType *)realloc(p->base, (p->size + STACKINCREMENT)*sizeof(ElemType));
if (!newbase) return -1;//
p->base = newbase;//
p->top = p->base + p->size;
p->size += STACKINCREMENT;//
}
*((p->top)++) = *e;
++p->length;
return 0;
}
static int pop(LinearListStack *This, ElemType* e){
LinearListStack_P *p = This->This;
if (p->top == p->base) return -1;
*e = *(p->top-1);
p->top--;
p->length--;
return 0;
}
LinearListstack. h 파일
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LINEARLISTSTACK_H
#define __LINEARLISTSTACK_H
/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
typedef char ElemType;
typedef struct LinearListStack_P{
ElemType *base;
ElemType *top; //
int length; //
int size; //
}LinearListStack_P;
typedef struct LinearListStack{
LinearListStack_P *This;
void (*clear)(struct LinearListStack *This);
int (*isEmpty)(struct LinearListStack *This);
int (*length)(struct LinearListStack *This);
void (*risePrint)(struct LinearListStack *This);
void (*downPrint)(struct LinearListStack *This);
int (*getTop)(struct LinearListStack *This,ElemType* e);
int (*push)(struct LinearListStack *This,ElemType* e);
int (*pop)(struct LinearListStack *This, ElemType* e);
}LinearListStack;
/* Exported define -----------------------------------------------------------*/
#define STACK_INIT_SIZE 100 //
#define STACKINCREMENT 10 // ( )
/* Exported macro ------------------------------------------------------------*/
LinearListStack *InitLinearListStack();
void DestroyLinearListStack(LinearListStack *L);
#endif
testLinear ListStack. c 파일
#include
#include
#include "LinearListStack.h"
int strlen(char *str){
int i = 0;
while(*(str+i) != '\0'){
i++;
}
return i;
}
int main(void)
{
int i;
char string[] = "abcdefgh";
int strlength = strlen(string);
ElemType elem;
LinearListStack *stack = InitLinearListStack();
printf("string length = %d
",strlength);
printf("stack is empty:%d
",stack->isEmpty(stack));
for (i = 0; i < strlength; i++){
stack->push(stack,string+i);
}
printf("base to top:
");
stack->risePrint(stack);
printf("top to base:
");
stack->downPrint(stack);
printf("stack is empty:%d
",stack->isEmpty(stack));
printf("stack length:%d
",stack->length(stack));
for(i=0;i < strlength; i++){
stack->getTop(stack,&elem);
printf("get top elem:%c
",elem);
stack->pop(stack,&elem);
printf("pop elem:%c
",elem);
}
printf("stack is empty:%d
",stack->isEmpty(stack));
printf("stack length:%d
",stack->length(stack));
stack->clear(stack);
DestroyLinearListStack(stack);
return 0;
}
컴 파일:
gcc LinearListStack.c LinearListStack.h testLinearListStack.c -o testLinearListStack
testLinear Liststack 출력 실행:
string length = 8
stack is empty:1
base to top:
abcdefgh
top to base:
hgfedcba
stack is empty:0
stack length:8
get top elem:h
pop elem:h
get top elem:g
pop elem:g
get top elem:f
pop elem:f
get top elem:e
pop elem:e
get top elem:d
pop elem:d
get top elem:c
pop elem:c
get top elem:b
pop elem:b
get top elem:a
pop elem:a
stack is empty:1
stack length:0
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.