以P和O(大寫字母O)表示入棧和出棧操作,根據一個P和O的序列,對一個空堆疊進行操作,當進行操作結束後,堆疊為空,則該序列是合法的,否則為非法的

ONE_one_plus發表於2020-10-30

內容:
假設以P和O(大寫字母O)表示入棧和出棧操作,根據一個P和O的序列,對一個空堆疊進行操作,當進行操作結束後,堆疊為空,則該序列是合法的,否則為非法的(包括棧滿操作沒完成,棧空操作沒完成,操作完成但堆疊為空)。當判斷為P時,輸入入棧元素併入棧,當判斷為O時輸出棧頂元素並出棧。入棧元素型別設為int型。

程式碼:

#include"stdio.h"
#include"string.h"
#include"stdlib.h"

#define MAXSIZE 10
 
typedef struct 
{
	int num[MAXSIZE];//儲存數字 
	int top;          //指向num棧頂 
 } SqStack, *Sq;
 
 void Display(Sq S)  // 顯示函式,輸出棧中元素 
{
	if(S->top== -1)
	{
		printf("棧為空"); 
	}
	else
	{
		printf("棧中元素是:"); 
		while(S->top != -1)
		{
			printf("%d ",S->num[S->top]);
		    S->top--;
		}
	}
}

  
int Push(Sq S )//數字入棧 
{   int flag=1;
	if(S->top == MAXSIZE-1)  // 棧滿 
	{   
	   flag = 0;
	}
	else
	{  
		S->top++;
		printf("輸入入棧數字:");
	    scanf("%d",&S->num[S->top]);
	    flag = 1;
	}
	return flag;
}


int Pop(Sq S)//數字出棧 
{   
    int flag = 1;
	if(S->top == -1)
	{   
	   flag = 0; 
	}
	else
	{
	    printf("輸出出棧元素:%d",S->num[S->top]);
	    printf("\n");
		S->top--;
		flag = 1;
	}
	 return flag;
} 


  
int main()
{
	Sq S=(SqStack *)malloc(sizeof(SqStack));
 	S->top = -1;  //初始化棧 
	int flag = 1;  //標誌變數 
	int l;          // 儲存Po序列長度 
	char PO[MAXSIZE]; //Po序列陣列
	printf("輸入PO序列:"); 
	gets(PO);
	l=strlen(PO);    //計算PO序列長度 
	
	for(int j=0; j<l; j++)  //根據PO序列 ,P為數字入棧,O為數字出棧 
	{
		if(PO[j]=='P')
		flag = Push(S);      
		else if(PO[j]=='O') 
		flag = Pop(S);
		else if(flag == 0)    // if(flag == 0)跳出迴圈 
		break;
	}

	
	if(flag==1 && S->top==-1)  //各步執行合法 即Push(S), Pop(S),執行完畢後棧為空! 
	printf("合法!");
	
	else                       //若PO序列 執行後不合法,輸出棧中剩餘元素 
	{
		printf("非法!\n");
	    Display(S); 
	}
	
	return 0;
}
  

相關文章