嚴蔚敏數據結構源代碼(C語言版)第三章棧和隊列

數制轉換

/*********************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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章