C 언어 양 방향 공유 스 택 실현
#pragma once
/*
, ,
*/
#define MAX_SIZE 20
#define ERROR -1
#define OVERFLOW -2
#define LEFT 0
#define RIGHT 1
typedef char ElemType;
typedef struct {
ElemType* base;
ElemType* l_top;
ElemType* r_top;
}s_stack;
void InitStack(s_stack& S);//
void DestroyStack(s_stack& S);//
bool EmptyStack(s_stack S,int stack_num);//
void ClearStack(s_stack& S);//
int SizeStack(s_stack S,int stack_num);//
void Push(s_stack& S, int stack_num, ElemType e);//
void Pop(s_stack& S, int stack_num, ElemType& e);//
void TraverseStack(s_stack S,int stack_num,void(*f)(ElemType e));//
ShareStack.c
#include
#include
#include "ShareStack.h"
void InitStack(s_stack& S) {
S.base =(ElemType*) malloc(MAX_SIZE * sizeof(ElemType));
if (!S.base) exit(ERROR);
S.l_top = S.base;
S.r_top = S.base + MAX_SIZE - 1;
}//
void DestroyStack(s_stack& S) {
free(S.base);
S.l_top = S.r_top = NULL;
}//
bool EmptyStack(s_stack S, int stack_num) {
if (stack_num == LEFT) return S.base == S.l_top ? true : false;
else if (stack_num == RIGHT) return S.base == S.r_top - MAX_SIZE + 1 ? true : false;
else exit(ERROR);
}//
void ClearStack(s_stack& S) {
S.l_top = S.base;
S.r_top = S.base + MAX_SIZE - 1;
}//
int SizeStack(s_stack S, int stack_num) {
if (stack_num == LEFT) return S.l_top - S.base;
else if (stack_num == RIGHT) return S.base + MAX_SIZE - 1 - S.r_top;
else exit(ERROR);
}//
void Push(s_stack& S, int stack_num, ElemType e) {
if (S.l_top > S.r_top)//
exit(OVERFLOW);
if (stack_num == LEFT) {
*(S.l_top++)=e;
}
else if (stack_num == RIGHT) {
*(S.r_top--) = e;
}
else {
exit(ERROR);
}
}//
void Pop(s_stack& S, int stack_num, ElemType& e) {
if (EmptyStack(S, stack_num)) exit(ERROR);
if (stack_num == LEFT) {
e = *(--S.l_top);
}
else if (stack_num == RIGHT) {
e = *(++S.r_top);
}
else {
exit(ERROR);
}
}//
void TraverseStack(s_stack S, int stack_num, void(*f)(ElemType e)) {
ElemType* p;
if (stack_num == LEFT) {
printf("stack 0:
");
p = S.l_top;
while(p-- != S.base) {
f(*(p));
}
}
else if (stack_num == RIGHT) {
printf("stack 1:
");
p = S.r_top;
while (p++!=S.base+MAX_SIZE-1)
{
f(*(p));
}
}
else {
exit(ERROR);
}
}//
main. c (테스트 용)
#include
#include
#include "ShareStack.h"
void InitStack(s_stack& S) {
S.base =(ElemType*) malloc(MAX_SIZE * sizeof(ElemType));
if (!S.base) exit(ERROR);
S.l_top = S.base;
S.r_top = S.base + MAX_SIZE - 1;
}//
void DestroyStack(s_stack& S) {
free(S.base);
S.l_top = S.r_top = NULL;
}//
bool EmptyStack(s_stack S, int stack_num) {
if (stack_num == LEFT) return S.base == S.l_top ? true : false;
else if (stack_num == RIGHT) return S.base == S.r_top - MAX_SIZE + 1 ? true : false;
else exit(ERROR);
}//
void ClearStack(s_stack& S) {
S.l_top = S.base;
S.r_top = S.base + MAX_SIZE - 1;
}//
int SizeStack(s_stack S, int stack_num) {
if (stack_num == LEFT) return S.l_top - S.base;
else if (stack_num == RIGHT) return S.base + MAX_SIZE - 1 - S.r_top;
else exit(ERROR);
}//
void Push(s_stack& S, int stack_num, ElemType e) {
if (S.l_top > S.r_top)//
exit(OVERFLOW);
if (stack_num == LEFT) {
*(S.l_top++)=e;
}
else if (stack_num == RIGHT) {
*(S.r_top--) = e;
}
else {
exit(ERROR);
}
}//
void Pop(s_stack& S, int stack_num, ElemType& e) {
if (EmptyStack(S, stack_num)) exit(ERROR);
if (stack_num == LEFT) {
e = *(--S.l_top);
}
else if (stack_num == RIGHT) {
e = *(++S.r_top);
}
else {
exit(ERROR);
}
}//
void TraverseStack(s_stack S, int stack_num, void(*f)(ElemType e)) {
ElemType* p;
if (stack_num == LEFT) {
printf("stack 0:
");
p = S.l_top;
while(p-- != S.base) {
f(*(p));
}
}
else if (stack_num == RIGHT) {
printf("stack 1:
");
p = S.r_top;
while (p++!=S.base+MAX_SIZE-1)
{
f(*(p));
}
}
else {
exit(ERROR);
}
}//
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.