【數據結構】棧的鏈式存儲結構

定義

//定義
typedef struct LinkStack
{
	int data;
	struct LinkStack* next;
}LinkStack;

基本操作

//初始化棧
LinkStack* InitLinkStack()
{
	LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack));
	s->next = NULL;
	return s;
}

//銷燬棧
void DestroyLinkStack(LinkStack* s)
{
	LinkStack* pre = s;
	LinkStack* p = s->next;
	while (!p)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

//棧判空
int LinkStackIsEmpty(LinkStack* s)
{
	return (s->next == NULL);
}
//入棧
void PushLinkStack(LinkStack* s,int e)
{
	LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
	p->data = e;
	p->next = s->next;
	s->next = p;
}

//出棧
void PopLinkStack(LinkStack* s, int *e)
{
	if (!s->next)
		return;
	LinkStack* p = s->next;
	*e = s->next->data;
	s->next = s->next->next;
	free(p);
}

//得到棧頂元素

void GetLinkStackTop(LinkStack* s, int* e)
{
	if (!s->next)	return;
	*e = s->next->data;
}

應用

//設計一種方法判斷字符串中括號是否對稱
//函數參數以及結構體data類型要相應修改,或者使用ascii值進行判斷
int MatchBrackets(char* ch)
{
	LinkStack* s = InitLinkStack();
	int n = strlen(ch);
	int i = 0;
	char e;
	bool match = true;
	while (i < n && match)
	{
		if (ch[i] == '(')
		{
			PushLinkStack(s, ch[i]);
		}
			
		else if (ch[i] == ')')
		{ 
			if (s->next->data == '(')		
				PopLinkStack(s, &e);
			else
			{
				DestroyLinkStack(s);
				return false;
			}
		}
		i++;
	}
	if (!LinkStackIsEmpty(s)) match = false; 
	DestroyLinkStack(s);
	return match;
}

  • 算式轉爲後綴表達式
    在這裏插入圖片描述
//將中綴表達式轉爲後綴表達式
void Trans(ElemType* exp, ElemType postExp[])
{
	SqStack* pExp = InitStack();
 	char e = '0';
	int i = 0;
	while (*exp != '\0')
	{
		switch (*exp)
		{
		case '(':
			Push(pExp, *exp);
			exp++;
			break;
		case ')':
			Pop(pExp, &e);
			while (e != '(')
			{
				postExp[i++] = e;
				Pop(pExp,& e);				
			}
			exp++;
			break;
		case '+':
		case '-' :
			while (!StackEmpty(pExp))
			{
				GetTop(pExp, &e);
				if (e != '(')
				{
					Pop(pExp, &postExp[i]);
					i++;
				}					
				else
					break;
			} 
			Push(pExp, *exp);
			exp++;
			break;
		case '*':
		case '/':
			while (!StackEmpty(pExp))
			{
				GetTop(pExp, &e); 
				if (e == '*' || e == '/')
				{
					Pop(pExp, &postExp[i]);
					i++;
				}
				else
					break;				
			}
			Push(pExp, *exp);
			exp++;
			break;
		default:
			while ((*exp >= '0') && (*exp <= '9'))
			{
				postExp[i++] = *exp;
				exp++;
			}
			postExp[i++] = '#';
			break;
		}
	}
	while (!StackEmpty(pExp))
	{
		Pop(pExp, &postExp[i]);
		i++;
	}
	postExp[i++] = '\0';
	DestroyStack(pExp);
}

在這裏插入圖片描述

  • 計算後綴表達式的值
    在這裏插入圖片描述
//計算後綴表達式的計算值

void CompValue(char * postExp)
{
	double a, b, c, d;
	//這裏使用的棧要將ElemType設置成double型,
	//因爲要進行數值計算
	SqStack* Opnd = InitStack();
	;
	//
	while (*postExp != '\0')
	{
		switch ( *postExp)
		{
		case '+':
			Pop(Opnd, &a);
			Pop(Opnd, &b);
			c = b + a;
			Push(Opnd, c);
			break;
		case '-':
			Pop(Opnd, &a);
			Pop(Opnd, &b);
			c = b - a;
			Push(Opnd, c);
			break;
		case '*':
			Pop(Opnd, &a);
			Pop(Opnd, &b);
			c = b * a;
			Push(Opnd, c);
			break;
		case '/':
			Pop(Opnd, &a);
			Pop(Opnd, &b);
			if (a != '/')
			{
				c = b / a;
				Push(Opnd, c);
				break;
			}
			else
			{
				printf("error !");
				exit(0);
			}
			break;
		default:
			d = 0;
			while (*postExp >= '0' && *postExp <= '9')
			{
				d = 10 * d + (*postExp - '0');
				postExp++;
			}
			Push(Opnd, d);		
			break;
		}
		postExp++;
	}
	GetTop(Opnd, &a);
	return a;
	return a;
}

迷宮問題求解

  • 給定一個迷宮M*N
    在這裏插入圖片描述
  • 設立數組來表示迷宮,1表示有阻礙,0表示空白
  • 算法
    在這裏插入圖片描述
//定義
int mg[M + 2][N + 2] =
{
	{1,1,1,1,1,1,1,1,1,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,0,0,1,1,0,0,1},
	{1,0,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,0,0,0,0,1},
	{1,0,1,0,0,0,1,0,0,1},
	{1,0,1,1,1,0,1,1,0,1},
	{1,1,1,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}
};

typedef struct Box
{
	int i;
	int j;
	int adj;
}Box;

typedef struct SqMgStack
{
	Box data[MAX_SIZE];
	int top;
}SqMgStack;

//實現過程
bool MgPath(int xi,int yi,int xe,int ye)
{
	SqMgStack* st = InitSqStack();
	Box path[MAX_SIZE], e;
	mg[xi][yi] = -1;
	bool find;
	int iMg = 0;
	int jMg = 0;
	int i = 0;
	int j = 0;
	int adj = 0;
	e.i = xi;
	e.j = yi;
	e.adj = -1;
	PushSqStack(st, e);
	while (!SqStackEmpty(st))
	{
		GetSqStack(st, &e);
		i = e.i;
		j = e.j;
		adj = e.adj;
		if (i == xe && j == ye)
		{
			FindThePath(st, path);  //這個函數進行輸出棧中的值;
			return true;
		}
		find = false;
		while (adj < 4 && !find)
		{
			adj++;
			switch (adj)
			{
			case 0:
				iMg = i - 1 ;
				jMg = j ;
				break;
			case 1:
				iMg = i;
				jMg = j +1 ;
				break;
			case 2:
				iMg = i +1;
				jMg = j  ;
				break;
			case 3:
				iMg = i ;
				jMg = j  -1;
				break;
			default:
				break;
			}
			if (mg[iMg][jMg] == 0)  find = true;
		}
		if (find)
		{
			st->data[st->top].adj = adj;
			e.i = iMg;
			e.j = jMg;
			e.adj = -1;
			PushSqStack(st, e);
			mg[iMg][jMg] = -1;
		}
		else
		{
			PopSqStack(st, &e);
			mg[e.i][e.j] = 0;
		}
	}
	DestroySqStack(st);
	return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章