1. 程式人生 > >C資料結構-棧和佇列,括號匹配舉例---ShinePans

C資料結構-棧和佇列,括號匹配舉例---ShinePans

1.棧和佇列是兩種特殊的線性表

            運算操作被限定只能在表的一端或兩端插入,刪除元素,故也稱它們為限定的線性表結構

2.棧的基本運算

1).Stackinit(&s) 構造一個空棧 2).Stackempty(s) 判斷s是否為空棧,當s為空棧時,函式返回值1 否則 0 3).Push(&s,x)  在棧s 的頂部插入元素x,簡稱將x入 棧 4).Pop(&s,&x) 在棧s 中刪除頂元並將其值儲存在x單元中返回,簡稱將x出棧 5)Gettop(s,&x)  讀s棧中的頂元素,將其值儲存在x 單元中並返回 6)Stacklength(s)  返回棧s中元素的個數,即s的長度 7)Stackfull(s)  判定棧s 是否已滿,當s已滿時,返回值為1 否則為 0 應用, (){}[] 括號的匹配 舉例:(待完善)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>  //system(); 這個指令需要用到此標頭檔案
#include <ctype.h> //toupper要用到
#include <malloc.h> //在記憶體管理時用到的標頭檔案
#include <string.h>  //字串的標頭檔案

#define MAX_SIZE 100  //定義棧初始空間的容量

typedef struct      //建立結構體
{
	int top;
	int size;
	char *base;
}STACK;

void push(STACK *s, char e);   //壓入元素
void pop(STACK *s, char *e);   //刪除元素

void push(STACK *s, char e)
{
	if (s->top + 1 > MAX_SIZE) //如果 此時top之前指向 100的位置,那麼就要溢位了,則例通過判斷排除溢位的情況,直接退出當前函式
		return;
	*(s->base + s->top) = e; //base指向棧底,top指向棧頂元素的上一層空白處,將空白處填入e
	s->top++;   //空白處填入1後,top指向下一個空白
}

void pop(STACK *s, char *e)
{
	if (s->top <= 1)  
		return;
	*e = *(s->base + s->top);
	s->top--;  //將棧頂指標 回移
}

STACK stack;
int result = 0;

void main(int argc, char **argv)
{
	char buf[100];
	int i = 0;
	char temp;
	stack.top = 1;  //資料從stack->base+stack+top 開始存
	stack.size = MAX_SIZE;  //為100
	stack.base = (char *)malloc(sizeof(char)*stack.size);//申請記憶體空間
	if (stack.base = NULL)
	{
		printf("stack = NULL RETURN");
		return;
	}
	memset(stack.base, '0', sizeof(STACK));

	memcpy(buf, argv[1], strlen(argv[1]));//將需要解析的字串存在buf中
	buf[strlen(argv[1])] = '\0'; //'\0'來表示結束

	while (buf[i] != '\0')
	if (buf[i] == '(')  //碰到左括號
	{
		push(&stack, buf[i]); //出現左括號,入棧
	}
	else if (buf[i] == ')')  //碰到右括號
	{
		if (stack.top == 1) //如果棧中沒有左括號,則錯誤,result=1
		{
			result = 1;
		}
		else if (*(stack.base + stack.top - 1) == '(');//如果棧裡有左括號
		{
			pop(&stack, &temp); //出棧
		}
		i++;
	}
	if (stack.top > 1) //如果括號中還有左括號,缺少右括號
		result = 1;
	if (result == 1)
		printf("Wrong!");
	if (result == 0)
		printf("Right");
}

{}[] 的原理也一樣