程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> _DataStructure_C_Impl:鏈棧

_DataStructure_C_Impl:鏈棧

編輯:C++入門知識

_DataStructure_C_Impl:鏈棧


//_DataStructure_C_Impl:鏈棧
#include
#include

typedef char DataType;
typedef struct node{
	DataType data;
	struct node *next;
}LStackNode,*LinkStack;
//將鏈棧初始化為空。動態生成頭結點,並將頭結點的指針域置為空
void InitStack(LinkStack *top){
	if((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL)		//為頭結點分配一個存儲空間
		exit(-1);
	(*top)->next=NULL;		//將鏈棧的頭結點指針域置為空
}
//判斷鏈棧是否為空,就是通過判斷頭結點的指針域是否為空
int StackEmpty(LinkStack top){
	if(top->next==NULL)		//當鏈棧為空時,返回1;否則返回0
		return 1;
	else 
		return 0;
}
//進棧操作就是要在鏈表的第一個結點前插入一個新結點,進棧成功返回1
int PushStack(LinkStack top,DataType e){
	LStackNode *p;	//指針p指向新生成的結點
	if((p=(LStackNode *)malloc(sizeof(LStackNode)))==NULL){
		printf(內存分配失敗
);
		exit(-1);
	}
	p->data=e;
	p->next=top->next;	//指針p指向表頭結點
	top->next=p;
	return 1;
}
//刪除單鏈表中的第i個位置的結點。刪除成功返回1,失敗返回0
int PopStack(LinkStack top,DataType *e){
	LStackNode *p;
	p=top->next;
	if(!p){		//判斷鏈棧是否為空
		printf(棧已空
);
		return 0;
	}
	top->next=p->next;	//將棧頂結點與鏈表斷開,即出棧
	*e=p->data;		//將出棧元素賦值給e
	free(p);		//釋放p指向的結點
	return 1;
}
//取棧頂元素操作
int GetTop(LinkStack top,DataType *e){
	LStackNode *p;
	p=top->next;
	if(!p){		//判斷鏈棧是否為空
		printf(棧已空
);
		return 0;
	}
	*e=p->data;	//將棧頂元素賦值給e
	return 1;
}
//求表長操作
int StackLength(LinkStack top){
	LStackNode *p;
	int count=0;
	p=top;
	while(p->next!=NULL){
		p=p->next;
		count++;
	}
	return count;
}
//銷毀鏈棧操作
void DestroyStack(LinkStack top){
	LStackNode *p,*q;
	p=top;
	while(!p){
		q=p;
		p=p->next;
		free(q);
	}
}
void main_LinkStack(){
	LinkStack S;
	DataType ch[50],e,*p;
	InitStack(&S);
	printf(請輸入進棧的字符:
);
	gets(ch);
	p=&ch[0];
	while(*p){
		PushStack(S,*p);
		p++;
	}
	printf(當前棧頂的元素是:);  
	if(GetTop(S,&e)==0){
		printf(棧已空!
);
		return ;
	}else{
		printf(%4c
,e);
	}
	printf(當前棧中的元素個數是:%d
,StackLength(S));
	printf(元素出棧的序列是:);
	while(!StackEmpty(S)){
		PopStack(S,&e);
		printf(%4c,e);
	}
	printf(
);
	system(pause);
}
//********************************
int Match(DataType e,DataType ch){
	if(e=='('&&ch==')')
		return 1;
	else if(e=='['&&ch==']')
		return 1;
	else if(e=='{'&&ch=='}')
		return 1;
	else
		return 0;
}
void main_Match(){
	LinkStack S;
	char *p;
	DataType e;
	DataType ch[100];
	InitStack(&S);
	printf(請輸入帶括號的表達式('{}','[]','()').
);
	gets(ch);
	p=ch;
	while(*p){
		switch(*p){
		case '(':
		case '[':
		case '{':
			PushStack(S,*p++);
			break;
		case ')':
		case ']':
		case '}':
			if(StackEmpty(S)){
				printf(缺少左括號.
);
				return;
			}else{
				GetTop(S,&e);
				if(Match(e,*p))
					PopStack(S,&e);
				else{
					printf(左右括號不配對.
);
					return;
				}
			}
		default:
			p++;
		}
	}
	if(StackEmpty(S))
		printf(括號匹配.
);
	else
		printf(缺少右括號.
);
	system(pause);
}
//===========
void main(){
	main_LinkStack();
	main_Match();
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved