棧
數制轉換
/*********************Stack.h******************************/
#pragma once
#ifndef _STACK_H_
#define _STACK_H_
#include<stdio.h>
#include<stdlib.h>
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct SqStack{
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
Status InitStack(SqStack* s);
Status DestroyStack(SqStack* s);
Status ClearStack(SqStack* s);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType* e);
Status Push(SqStack* s, SElemType e);
Status Pop(SqStack* s, SElemType* e);
Status StackTraverse(SqStack S, Status(*visit)(SElemType e));
#endif // !_STACK_H_
/*********************stack.c******************************/
#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"
Status InitStack(SqStack* S)
{
S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base)exit(OVERFLOW);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
Status GetTop(SqStack S, SElemType* e)
{
if (S.top == S.base)return ERROR;
*e = *(S.top - 1);
return OK;
}//Gettop
Status Push(SqStack *S, SElemType e)
{
if (S->top - S->base >= S->stacksize)
{
S->base = (SElemType*)realloc(S->base, (S->stacksize+ STACKINCREMENT) * sizeof(SElemType));
if (!S->base)exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}
Status Pop(SqStack* s, SElemType* e)
{
if (s->top == s->base)
return ERROR;
*e = *--s->top;
return OK;
}
Status StackEmpty(SqStack S)
{
if (S.base == S.top)
return OK;
else
return FALSE;
}
Status DestroyStack(SqStack* s)
{
if (s->base) {
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize = 0;
return OK;
}
}
Status ClearStack(SqStack* S)
{
if (S->base) {
S->top = S->base;
}
}
int StackLength(SqStack S)
{
return S.top - S.base;
}
Status StackTraverse(SqStack S, Status(*visit)(SElemType e))
{
while (S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e)
{
printf("%d ", e);
return OK;
}
/********************main.c***********************/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"Stack.h"
void conversion(SqStack *S,int N)
{
SElemType X = 0;
//爲指針分配地址
SElemType* e = &X;
while (N) {
Push(S, N % 8);
N = N / 8;
}
while (!StackEmpty(*S))
{
Pop(S,e);
printf("%d", *e);
}
}
int main()
{
int n;
//爲棧結構指針初始化
SqStack* S = (SqStack*)malloc( sizeof(SqStack));
scanf("%d", &n);
//初始化棧
InitStack(S);
//轉換
conversion(S,n);
return 1;
}
括號匹配(有缺陷的代碼)
/*********************stack.c******************************/
#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"
Status InitStack(SqStack* S)
{
S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base)exit(OVERFLOW);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
Status GetTop(SqStack S, SElemType* e)
{
if (S.top == S.base)return ERROR;
*e = *(S.top - 1);
return OK;
}//Gettop
Status Push(SqStack *S, SElemType e)
{
if (S->top - S->base >= S->stacksize)
{
S->base = (SElemType*)realloc(S->base, (S->stacksize+ STACKINCREMENT) * sizeof(SElemType));
if (!S->base)exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}
Status Pop(SqStack* s, SElemType* e)
{
if (s->top == s->base)
return ERROR;
*e = *--s->top;
return OK;
}
Status StackEmpty(SqStack S)
{
if (S.base == S.top)
return OK;
else
return FALSE;
}
Status DestroyStack(SqStack* s)
{
if (s->base) {
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize = 0;
return OK;
}
}
Status ClearStack(SqStack* S)
{
if (S->base) {
S->top = S->base;
}
}
int StackLength(SqStack S)
{
return S.top - S.base;
}
Status StackTraverse(SqStack S, Status(*visit)(SElemType e))
{
while (S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e)
{
printf("%d ", e);
return OK;
}
int pop(SqStack* x) {
if (!StackEmpty(*x))
{
--x->top;
return 1;
}
return 0;
}
//獲取棧頂數據
char Gettop(SqStack stack) {
if (stack.base == stack.top) {
printf("棧中沒有數據\n");
return '#';
}
//printf("%c\n", *(stack.top - 1));
return *(stack.top - 1);
}
int ExecuteData(SqStack* stack, char* data) {
Push(stack, data[0]);
for (int i = 1; i < strlen(data); i++) {
char top = Gettop(*stack);
printf("%c\n", top);
switch (top) {
case '(':
if (data[i] == ')')pop(stack);
else Push(stack, data[i]);
break;
case '[':
if (data[i] == ']')pop(stack);
else Push(stack, data[i]);
break;
case '#':
if (data[i] == '(' || data[i] == '[') {
Push(stack, data[i]);
break;
}
else
default: break;
}
}
if (stack->top == stack->base) {
DestroyStack(stack);
return 1;
}
else {
DestroyStack(stack);
return 0;
}
}
/********************main.c***********************/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"Stack.h"
int main()
{
SqStack *stack=(SqStack*)malloc(sizeof(SqStack));
InitStack(stack);
char data[180];
scanf("%s", data);
int result = ExecuteData(stack, data);
if (result)printf("括號是正確匹配的\n");
else printf("括號匹配不正確\n");
free(stack);
return 0;
}