沈師PTA數據結構第3章實驗題集-棧與隊列操作


R7-1 堆棧操作合法性 (20 分)

假設以SX分別表示入棧和出棧操作。如果根據一個僅由SX構成的序列,對一個空堆棧進行操作,相應操作均可行(如沒有出現刪除時棧空)且最后狀態也是棧空,則稱該序列是合法的堆棧操作序列。請編寫程序,輸入SX序列,判斷該序列是否合法。

輸入格式:

輸入第一行給出兩個正整數N和M,其中N是待測序列的個數,M(≤50)是堆棧的最大容量。隨后N行,每行中給出一個僅由SX構成的序列。序列保證不為空,且長度不超過100。

輸出格式:

對每個序列,在一行中輸出YES如果該序列是合法的堆棧操作序列,或NO如果不是。

輸入樣例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
結尾無空行

輸出樣例:

YES
NO
NO
NO
結尾無空行
#include<iostream>
#include<malloc.h>
#include<stdlib.h>
#include<string>
#define OVERFLOW   -2
#define OK          1
#define ERROR       0
typedef int  Status;
using namespace std;
typedef struct{
    char *base;
    char *top;
    int stacksize;
} SqStack;

Status InitStack(SqStack &S,int L){
    S.base=new char[L];
    if(!S.base)
        exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=L;
    return OK;
}

Status push(SqStack &S,char c){
    if(S.top-S.base==S.stacksize)
        return ERROR;
    *S.top++=c;
    return OK;
}

Status pop(SqStack &S,char c){
    if(S.top==S.base)
        return ERROR;
    c=*(--S.top);
    return OK;
}

bool IsRight(string s,int L){
    int i=0,flag=1;
    SqStack St;
    InitStack(St,L);
    while(s[i]!='\0'){
        if(s[i]=='S'){
            if(push(St,s[i])==OK)
                i++;
            else{
                flag=0;
                break;
            }
        }
        else{
            if(pop(St,s[i])==OK)
                i++;
            else{
                flag=0;
                break;
            }
        }
    }
    if((St.top==St.base) && s[i]=='\0')
        flag=1;
    else
        flag=0;
    if(flag==1)
        return true;
    else
        return false;
}


int main()
{
    int N,M,k=0;
    char c;
    string ss;
    cin>>N>>M;
    for(int i=0; i<N; i++)
    {
        cin>>ss;
        if(IsRight(ss,M)==true)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}

R7-2 括號匹配 (20 分)

檢查一段C語言代碼的小括號( )、 中括號 [ ] 和大括號{ } 是否匹配。

輸入格式:

在一行中輸入一段C語言代碼,長度不超過1000個字符(行末以換行符結束)。

輸出格式:

第一行輸出左括號的數量和右括號的數量,中間以一個空格間隔。
若括號是匹配的,在第二行打印YES,否則打印NO

輸入樣例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }
結尾無空行

輸出樣例1:

8 8
YES
結尾無空行

輸入樣例2:

for(int i=0; i<v; i++) a(i]=0;

輸出樣例2:

2 2
NO
#include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

int main() {
	string s;
	stack<char> st;
	getline(cin,s);
	int l=0,r=0;
	bool flag=1;
	for(int i=0; i<s.length(); i++) {
		if(s[i]=='('||s[i]=='['||s[i]=='{') {
			l++;
			st.push(s[i]);
		}
		if(s[i]==')'||s[i]==']'||s[i]=='}') {
			r++;
			if(st.empty()) {
				flag=0;
				continue;
			}
			int ch=st.top();
			if(flag&&((ch=='('&&s[i]==')')||(ch=='['&&s[i]==']')||(ch=='{'&&s[i]=='}'))) {
				st.pop();
			} else
				flag=0;
		}
	}
	cout<<l<<" "<<r<<endl;
	if(flag&&st.empty()) cout<<"YES\n";
	else cout<<"NO\n";
	return 0;
}

R7-3 字符串對稱 (20 分)

編寫一個算法利用順序棧判斷一個字符串是否是對稱串。所謂對稱串是指從左向右讀和從右向左讀的序列相同。

輸入格式:

輸入一個無空格的字符串。

輸出格式:

如果該字符是對稱的,輸出yes,否則輸出no。

輸入樣例:

在這里給出一組輸入。例如:

abba
結尾無空行

輸出樣例:

在這里給出相應的輸出。例如:

yes
結尾無空行

輸入樣例:

在這里給出一組輸入。例如:

abcd
結尾無空行

輸出樣例:

在這里給出相應的輸出。例如:

no
結尾無空行
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
#define MaxSize 60
typedef int ElemType;
typedef struct {
   ElemType data[MaxSize];
   int top;  //棧頂指針
}SqStack;  //定義順序棧類型
//初始化棧
void InitStack(SqStack *&s){
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
}
//銷毀棧
void DestroyStack(SqStack *&s){
   free(s);
}
//判空
bool StackEmpty(SqStack *s){
	return(s->top==-1);
}
//進棧
bool Push(SqStack *&s,ElemType e){
	if(s->top==MaxSize-1)  //進棧判滿
	   return false;
	s->top++; //指針加一
	s->data[s->top]=e;
	return true;
}
//出棧
bool Pop(SqStack *&s,ElemType &e){
	if(s->top==-1)  //出棧判空
		return false;
	e=s->data[s->top]; //取棧頂元素
	s->top--; //指針減一
	return true;
}
//判斷一個字符串是否是對稱串
bool symmetry(string str){
   ElemType e;
   SqStack *st;
   InitStack(st);   //初始化棧
   //元素進棧
   for(int i=0;i<str.length();i++){
      Push(st,str[i]); 
   }
   //比較棧中元素和字符串
   for(int i=0;i<str.length();i++){
       Pop(st,e); //出棧,e存放的是當前棧頂元素
	   if(e!=str[i]){  //不同
		  DestroyStack(st);  //銷毀棧
		  return false;
	   }
   }
   DestroyStack(st);
   return true;
}
int main(){
   string str;
   //cout<<"str:";
   cin>>str;
   bool flag;
   //判斷它是不是對稱串
   flag=symmetry(str);
   if(flag)
	   cout<<"yes"<<endl;
   else
	   cout<<"no"<<endl;
}

R7-4 數據結構考題 十進制轉換為二進制 (20 分)

利用棧(以順序棧作存儲結構)實現進制轉換。給定一個十進制整數,編程將該數以二進制形式輸出。

順序棧的類型定義:

#define MAXSIZE 100   // MAXSIZE為最大數據元素數目
typedef int ElemType;
typedef struct
{   ElemType  *base;
    ElemType  *top;
}SqStack;

輸入格式:

輸入一個十進制整數。

輸出格式:

輸出轉換后的二進制數。

輸入樣例:

15
結尾無空行

輸出樣例:

在這里給出相應的輸出。例如:

1111
結尾無空行
#include <bits/stdc++.h>
using namespace std;

#define MaxSize 100		/* 棧最大容量 */
int top;				/* 棧頂指針 */
int mystack[MaxSize];	/* 順序棧 */

/*判棧是否為空,空返回true,非空返回false */
bool isEmpty();

/* 元素x入棧 */
void Push(int x);

/* 取棧頂元素 */
int getTop();

/* 刪除棧頂元素 */
void Pop();

/* 十進制正整數轉換為二進制 */
void dec2bin(int x) {
	top = -1;			/* 初始化棧頂指針 */
	while (x) {
		Push(x % 2);
		x >>= 1;
	}
	while (!isEmpty()) {
		int t = getTop();
		Pop();
		printf("%d", t);
	}
	//printf("\n");
}


int main(int argc, char const *argv[]){
	int n;
	while (scanf("%d", &n) != EOF) {
		dec2bin(n);
	}
	return 0;
}


bool isEmpty(){
	if (top == -1)
		return true;
	else
		return false;
}

/* 元素x入棧 */
void Push(int x){
	if (top == MaxSize - 1)
		return;
	else
	{
		top++;
		mystack[top] = x;
	}

}

/* 取棧頂元素 */
int getTop(){
	if (top == -1)
		return 0;
	else
		return mystack[top];
}

/* 刪除棧頂元素 */
void Pop(){
	if (top == -1)
		return;
	else
		top--;
}

R7-5 數據結構考題 十進制轉換為八進制 (20 分)

利用棧(以順序棧作存儲結構)實現進制轉換。給定一個十進制整數,編程將該數以八進制形式輸出。

順序棧的類型定義:

#define MAXSIZE 100   // MAXSIZE為最大數據元素數目
typedef int ElemType;
typedef struct
{   ElemType  *base;
    ElemType  *top;
}SqStack;

輸入格式:

輸入一個十進制整數。

輸出格式:

輸出轉換后的八進制數。

輸入樣例:

100
結尾無空行

輸出樣例:

在這里給出相應的輸出。例如:

144
結尾無空行
#include<stdio.h>
#include<stdlib.h>

//定義棧結構
typedef struct stack{
	int num[50];
	int tap;
}Stack;

//聲明函數
void setTable(char* table);
void push(int number);
int pop();
int isEmpty();

//聲明全局變量
Stack *stack;

int main(){
	int number;	//number-被轉換數

	char table[36];		//定於數字字母匹配表
	setTable(table);

	//printf("輸入十進制數字:");
	scanf("%d",&number);

	stack = (Stack*)malloc(sizeof(Stack));	
	stack->tap=0;

    //短除法
	while(1){
		push( number % 8);
		number = number/8;
		if(number == 0)break;
	}

	//printf("結果為:");
	while(isEmpty() == 0){
		printf("%c",table[pop()]);
	}
	//putchar(10);//換行
    return 0;
}

//填充數字字母表
void setTable(char table[]){
	int i = 0;
	for(;i<10;i++){
		table[i]='0'+i;
	}
	for(;i<37;i++){
		table[i]='A'+i-10;
	}
}

//入棧
void push(int number){
	stack->num[stack->tap] = number;
	stack->tap = stack->tap + 1;
}

//出棧
int pop(){
	stack->tap = stack->tap - 1;
	return  stack->num[stack->tap];
}

//判斷是否為空
int isEmpty(){
	if(stack->tap == 0)
        return 1;
	else 
        return 0;
}

R7-6 隊列操作 (20 分)

請實現一個MyQueue類,實現出隊,入隊,求隊列長度.

實現入隊函數 void push(int x); 實現出隊函數 int pop(); 實現求隊列長度函數 int size();

輸入格式:

每個輸入包含1個測試用例。每個測試用例第一行給出一個正整數 n (n <= 10^6) ,接下去n行每行一個數字,表示一種操作: 1 x : 表示從隊尾插入x,0<=x<=2^31-1。 2 : 表示隊首元素出隊。 3 : 表示求隊列長度。

輸出格式:

對於操作2,若隊列為空,則輸出 “Invalid”,否則請輸出隊首元素。 對於操作3,請輸出隊列長度。 每個輸出項最后換行。

輸入樣例:

5
3
2
1 100
3
2
結尾無空行

輸出樣例:

0
Invalid
1
100
#include<iostream> 
using namespace std;
typedef struct queue{
	int x;
	struct queue *next;
} LinkList;
class  MyQueue{
	LinkList *head, *node, *end; 
	static int j;
	public:
		MyQueue()
		{
			head=NULL; 
			node=NULL;
			end=NULL; 
			head=new LinkList;
			end=head;
			
		}
		void push(int x)
		{
	    	node=new LinkList;
			node->x=x;
			end->next=node;
			node=end; 
			j++;
		}
		void pop()
		{
			if(j==0)
		    	cout<<"Invalid"<<endl;
			else
			     {
			     	cout<<head->next->x<<endl;
			     	head->next=head->next->next;
			     	delete head->next;
		        	j--;
				 }
		}
		int size(){
			return j;
		}
};

int MyQueue::j=0;


int main(void){
	MyQueue ob;
	int n,i,c,d;
	scanf("%d",&n); 
	for(i=0;i<n;i++){
		scanf("%d",&c);
		switch(c){
			case 1:
				{
					scanf("%d",&d);
					ob.push(d);
					break;
				}
			case 2:ob.pop();break;
			case 3:cout<<ob.size()<<endl;break;
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM