스 택 에서 사용 할 접미사 표현 식 접미사 표현 식 (C 언어)
21955 단어 데이터 구조
- - - - - - - - - - - - 1. 먼저 우 리 는 집합 sList 를 만들어 예 중의 데이터 와 조작 기 호 를 저장 하고 스 택 opStack 을 만들어 중간 에 있 는 조작 기 호 를 저장 하 며 dList 를 집합 하여 마지막 전환 결 과 를 저장 해 야 합 니 다.2. sList 에서 하나의 요소 A 를 추출 한 다음 에 다음 과 같은 판단 을 한다. (1) A 가 숫자 라면 dList (2) A 가 연산 자 라면 opStack 스 택 꼭대기 의 요소 와 연산 우선 순위 비교 (2 - 1) A 의 우선 순위 가 스 택 꼭대기 연산 자 우선 순위 보다 높 으 면 A 를 스 택 에 넣 는 opStack (2 - 2) A 의 우선 순위 가 스 택 꼭대기 연산 자의 우선 순위 보다 낮 거나 같 으 면그러면 스 택 꼭대기 의 요 소 를 dList 에 저장 하고 스 택 꼭대기 의 연산 자 우선 순위 가 현재 연산 자 (또는 괄호 를 만 났 을 때) 보다 낮 을 때 까지 이 절 차 를 반복 한 다음 에 A 가 스 택 에 들 어 갑 니 다. 3. A 가 왼쪽 괄호 라면 "(" 직접 스 택 에 들 어 갑 니 다. 오른쪽 괄호 라면 ")"왼쪽 괄호 가 나 올 때 까지 opStack 의 연산 자 를 꺼 내 dList 에 저장 합 니 다. 왼쪽 괄호 가 나 올 때 까지 왼쪽 괄호 는 dList 에 저장 되 지 않 습 니 다. 오른쪽 괄호 를 만 날 때 까지 왼쪽 괄호 는 영원히 꺼 지지 않 습 니 다. 4. 표현 식 해석 이 끝 날 때 까지 상기 절 차 를 계속 반복 합 니 다.의 코드:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define STACK_INIT_SIZE 20
#define STACK_DILA_SIZE 10
typedef char elemtype;
typedef struct
{
elemtype * base;
elemtype * top;
int stacksize;
}sqstack;
void initstack(sqstack*s)
{
s->base = (elemtype*)malloc(STACK_INIT_SIZE * sizeof(elemtype));
if (!s->base)
{
exit(0);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
void push(sqstack*s, elemtype x)
{
if (s->top - s->base >= s->stacksize)
{
s->base = (elemtype*)realloc(s->base, (STACK_DILA_SIZE + STACK_INIT_SIZE) * sizeof(elemtype));
if (!s->base)
{
exit(0);
}
s->top = s->base + STACK_INIT_SIZE;
s->stacksize = +STACK_DILA_SIZE;
}
*(s->top) = x;
s->top++;
}
void pop(sqstack*s, elemtype*x)
{
if (s->base == s->top)
{
return;
}
s->top--;
*x = *s->top;
}
int stacklen(sqstack*s)
{
return (s->top - s->base);
}
void clearstack(sqstack*s)
{
s->top = s->base;
}
void destroystack(sqstack*s)
{
s->top = NULL;
s->base = NULL;
s->stacksize = 0;
free(s->base);
}
int main()
{
sqstack*s = (sqstack*)malloc(sizeof(sqstack));
initstack(s);
char c, x;
scanf_s("%c", &c, sizeof(c));
while (c != '#')
{
while (c >= '0'&&c <= '9')
{
printf("%c", c);
scanf_s("%c", &c, sizeof(c));
if (c < '0'||c > '9')
{
printf(" ");
}
}
if (')' == c)
{
pop(s, &x);
while ('(' != x)
{
printf("%c", x);
pop(s, &x);
}
}
else if ('+' == c || '-' == c)
{
if (!stacklen(s))
{
push(s, c);
}
else
{
do
{
pop(s, &x);
if ('(' == x)
{
push(s, x);
}
else
{
printf("%c", x);
}
} while (stacklen(s) && '(' != x);
push(s, c);
}
}
else if ('*' == c || '/' == c || '(' == c)
{
push(s, c);
}
else if ('#' == c)
{
break;
}
scanf_s("%c", &c, sizeof(c));
}
while (stacklen(s))
{
pop(s, &x);
printf("%c", x);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.