R7-1 堆棧操作合法性 (20 分)
假設以S
和X
分別表示入棧和出棧操作。如果根據一個僅由S
和X
構成的序列,對一個空堆棧進行操作,相應操作均可行(如沒有出現刪除時棧空)且最后狀態也是棧空,則稱該序列是合法的堆棧操作序列。請編寫程序,輸入S
和X
序列,判斷該序列是否合法。
輸入格式:
輸入第一行給出兩個正整數N和M,其中N是待測序列的個數,M(≤50)是堆棧的最大容量。隨后N行,每行中給出一個僅由S
和X
構成的序列。序列保證不為空,且長度不超過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;
}
}
}